|
・やっぱし今日も STL & iostream 入門書き。 STL があと1回ってとこまで来ました。今日中にその1回も完成させて、あとは C++ と最後のまとめの回だけ。今週中の完成も十分可能ですなー。
・今日書いたのは std::set とかの連想コンテナ関係。連想コンテナって、 STL の中でもとりあわけ便利なものなんだけど、逆に便利すぎるからアルゴリズムとかと一緒に使いにくいんだよね。そーゆーのもあって、コンテナから紹介するのはイヤだったってのがあります。だから最後ね。 ・ただ、連想コンテナだけの特殊な操作って、 find() とか upper_bound() とかくらいなんだよね。これ呼んだらイテレーター返ってくるから、そしたらアルゴリズムに使えるから。そのためにも、やっぱアルゴリズムから<しつこいって(汗)。ま、この辺がこのメルマガのウリだからね。 ・ iostream はともかくとして、 STL に関しては多くのドキュメントがすでにあるんですね。んでも今のところ満足できるものがないんですね。だから「 STL っていいよ」と勧められない(爆)。じゃー書こうってことになったわけです。ただ逆に、今回のは入門書だから、とてもすべては書ききれない、書ききれないところは既存のドキュメントに任せる、って形にしてます。 ・つまり STL も iostream も、エントリーレベルのドキュメントがないんで書いたってわけですね。 STL & iostream 入門は、他のドキュメント読んで「おお、理解できる」と思えるようなものになればいいなーと思います。うふふ。 ・でわまたっ! |
・今日はほとんど STL & iostream 入門書いてません。一応、昨日の夜中に少し書いて、 STL が終了! あとは C++ と最後のまとめですな。
・今日のお便り。 |
|
・どうもですー。とりあえずこのコード自体は問題なさそうですね。送ってくださったエラーメッセージから考えて、ふたつほど原因が思いつくかな。ひとつは、 CKeyboardHook クラスが DLL 内に置かれているんでシステムフックとして判断された。この場合には DLL じゃなく実行ファイルの方に置けば大丈夫かな。どうだろう……。
・ふたつめの原因は、スレッドIDの指定かなー。 SetWindowsHookEx() の最後の引数に AfxGetApp()->m_nThreadID を渡してみて。確かこれをやらないと動かない場合があったような……。あと第3引数に AfxGetInstanceHandle() を渡してみるとか。たぶんその辺じゃないかなーと。この辺が確か、なんかあったような記憶があるです。とりあえず試してみてね。 ・でわまたっ! |
・今日はプログラミングしてないんでお話なぞ。知っての通りわては「亜流ハンガリアン記法」を使ってます。この規則のうち、「変数名の頭に型が分かる名前をつける」ってのがあります。例えば int iData; とか、 double dData; とか。クラスは全部 c だけど。
・わては「組込型」はヒジョーに危険だと思ってます。まずほとんどの型がほとんどの演算子を使用できる。これは勝手に public メンバ関数作られたみたいで不安です。しかもメンバ関数じゃないからブレークポイントをセットできない。どんなときにどんな演算子が呼ばれどんな作用が発生したのか、組込型はそれを調べるのがかなり大変です。 ・ C++ ではテンプレートの存在で、組込型を統一的に操作できるようになりました。んでもこれは、一歩間違えば「思わぬ型に思わぬ操作」をしかねません。テンプレートはマクロの代替品、コードを省略するためのものであって、ポリモーフィズムなコードを生成させるためのものじゃないんです。テンプレートがどのようにインスタンス化されるかは、使用した時点で決まるし、そのときに「プログラマーの想像通り」に動くべきだからです。 ・ホントのこと言えば、組込型は使いたくないです(爆)。例えば CInt とか作って、演算子のオーバーロードをする。んでビット関係、たとえば << や | なんかは装備させない。ビットフラグ用には別のクラスを作る、みたいに。んでもこれはやっぱやりすぎだなーと思う。可読性と動作速度に影響が出るし、かぶヘッダーとかの「教え系」ではさすがにほいほい使えないしね。 ・だから、組込型を使う代わりに、できるだけ「間違った型を使って間違った処理がされる」ようなことがないようにすべき、だからプレフィックスに型名を付けるわけです。だいたい「型が変わったら変数名を変えなきゃいけない」って、型変えただけでほったらかしにする方がやばいやん、型を変えるってことは設計そのものが変わるってことくらい大きいことで、その副作用をチェックするためにも、変数名が変わるくらいがいいんとちゃう? ・クラスには、セキュリティのための仕組みが備わってます。アクセス指定子や、作らないと装備されない演算子とか。でも組込型は違う。組込型は裸同然、だから優しく扱わなきゃいけないんです。型名のプレフィックスは、ひ弱な組込型に対する精一杯の過保護だと思ってください。いつの日か、身を守る術を得るその日まで……。 ・でわまたっ! |
・今日はお休みぴょん。
・でわまたっ! |
・ STL & iostream 入門、完成!! いやーこんなに早く仕上がるとは思わなかったです。はっ、もしかしたら手抜きしたんじゃ!?<誰の話やねん。今日は C++ の書いてたんだけど、なんかちょっと C++ はネタ不足だったよーな気が(汗)。少し時間が経って、なんか書くこと思いついたら書きなおそっと。
・さて、これが完成したことでプログラミング関連のネタが尽きちゃうんで、ちょっとお知らせ。お知らせは、フリーウェアについて。これまでフリーウェアについては「 KTL 完成させてから」とゆーことにしていました。しかーし、それだとバージョンアップがえらい先になってしまいますね。 ・それでもいーやと思ってたんだけど、ふたつの理由がそれを許さないのです。ひとつは「バージョン情報」。引っ越ししたから、フリーウェアのバージョン情報に載っている URL やメルアドが使えなくなっちゃうわけですね。それをなんとかしないといけない。もうひとつは窓の杜。更新方法が変わったことで、毎月「残すか落とすか」チェックされるようになったんです。だからある程度頻繁に更新するようにしないとと思って。 ・で、結局、 MFC を使った状態で、フリーウェアをリビルドして、バージョンアップができる状態にしたいと思います。その上で、少しずつ KTL へと移行していこうと思ってます。もともと KTL は「他のライブラリと共存できる GUI ライブラリ」を目指してるんで、 MFC と一緒に使うのは問題ないんですね。この方が KTL も進むと思うんで、とりあえずこの方向で進んでいきたいと思うです。 ・今日、 STL & iostream 入門の C++ 編書いてて、ふと思い出したこと。 class CNuller { public: // Effective C++ SE P.131 のもの。 // 下のメンバ関数は VC6 では通りません。 template< class type_Ret > operator type_Ret *() { return reinterpret_cast< type_Ret * >( 0 ); } }; ・これは「メンバ関数テンプレート」という機能を使った「 NULL ポインタ発生装置」です。以前触れたことがあったよーなないよーな……。メンバ関数テンプレートの未サポートで、 VC6 はもとより gcc for Win32 でも通らなかったコード。ってゆーか、戻り値でオーバーロードされないんだからこんなんホントに通るんか? とか思ってた。 ・ところがどっこい、この前 gcc for Win32 をバージョンアップしたのを思い出して、これ再びコンパイルしてみました。そしたら通りました!! おー、 gcc すげー。やっぱこまめバージョンアップできるのは強みだよなー。ちなみに VC7 は2001年との噂。 BCB5 はプロフェッショナル版買うかなぁ……。 ・でわまたっ! |
・今日はプログラミングしてないや。昨日「フリーウェアのバージョンアップ」って話をしたけど、先にぷらとわとかなゆ〜書かなきゃいけないの思い出したんでちょっと後ね。ガッコ始まったら、授業の関連でフーリエ変換と暗号化関係のプログラミングをするんで、やっぱ少しあとかもしんない(汗)。あと STL & iostream 入門購読登録ありがとねー。
・でわまたっ。 |
・今日は久々にぷらとわを書きました。久々だったけど、結構すんなり書けたかなー。さすが1年間書き続けてきただけある(爆)。今日は2話完成。テストアプリの作り方と、メモリについて。51話以降はかなり基本的な部分をまずする予定。それをしないと、 API まわりとか教えられないんで。それにしても、 VC って教えやすい(爆)。
・困ったこと。辞書の単語が送られてきません(汗)。なんででしょう。思うに、辞書は引っ越し前のページしか見られていない、そのページでは登録部分が削除されている、これまでの登録はすべて「検索の間違い」だった、だから送られてこない、とか? まー楽でいーや(爆)。 ・今日のお便り。 |
|
・それって、オーバーライドされた関数がオーバーライドした関数を呼び出すってことですか(汗)。こわー。テンプレートとか使うと原理的にはできるけど……。ま、フツーのコードでは起きないんなら大丈夫でしょう。コンパイルチェックですが、とりあえず来月のCマガに付いてくる BCC5.5 を使って行おうと思ってます(ダイヤルアップで 8MB は辛い……)。たぶん数ヶ月後には BCB5 の試用版が着いてくると思うんでそれも試してみるつもり。とりあえず、おとといのメンバテンプレートがサポートされてなかったら買わないだろうなー(爆)。
・でわまたっ! |
・昨日書いたからか、辞書の単語送ってくれてありがとねー。今日はこれだけ(爆)。
・でわまたっ! |
・今日はかなゆ〜を書いてました。なんか今の「アプリのツボ」がやたら長くなっちゃいましたね。ホントはもっと短いサイクルでいろんなこと書いてこうと思ってたんだけどねー。ま、今回のが終わったらそうしましょう。んで終わらせるべく通信関係のことを今日は書いてました。
・アプリのツボのあとは、オブジェクト指向について書いてこうと思ってます。オブジェクト指向っていう言葉の便利さ、あいまいさ、現在の流れとかを書いてこうかなとか。オブジェクト指向に強く傾向すると、 C++ のいいところを殺しかねないところとかもね。結局は、設計重視か実装重視か、ってことかねぇ。 ・今日はこんなとこ。最近あんまプログラミングしてないです。することが色々あってね。逆に、それが楽しかったりも。ま、授業始まったらプログラミングのウェイトも大きくなるでしょ。 ・でわまたっ! |
・今日もプログラミングしてません。むー。ってゆーかなんで今こんなに忙しいんだろう。謎だ。
・今日のお便り。 |
|
・ PlatformSDK といっても大きいんでどの辺をダウンロードしたかに寄るかもしれないけど、とりあえず思いついたこと。まずどんなエラーが出るのか。
・ C2065 「定義されていない識別子です」だとインクルードファイルがうまくいってないっぽいです。まずメニューの「ツール」−「オプション」ダイアログの「ディレクトリ」−「インクルードファイル」のページで、インクルードファイルの置かれたフォルダが指定されているか、VCのものよりも上に来ているかをチェックしてみて。 ・優先順位を上げておかないと、ダウンロードしてきたのが読み込まれないから。ただ、その結果インクルードの順番が変わってぐちゃぐちゃになる可能性もあるかな。プリプロセッサマクロの関係でうまくいかないかも。あとインクルードファイルまわりだと、 StdAfx.h でインクルードしているかとかかも。その辺が注意どころやね。 ・ LNK2001 「外部シンボル(関数名)は未解決です」ならライブラリファイルの問題。インクルードファイルと同じくライブラリファイルもフォルダと優先順位を決められるからその辺をチェック。あと「プロジェクトの設定」ダイアログの「リンク」−「一般」ページの「オブジェクト/ライブラリモジュール」でライブラリファイルを指定(もしくは #pragma を使用)しわすれてないかチェック。この辺はCodianの DLL 関係のを見てね。 ・まー最悪の場合、インクルードファイルもライブラリファイルも、直にフルパス指定しちゃうって方法もあるし、アプリ側にコピーするってこともできるし、とりあえず動くのを確認することが大事かな。ってゆーか、わては Win2K 持ってないから試せない……。 ・でわまたっ! |
・今日もあんまプログラミングしてないです。ダメですなー。余談ですが、プログラミング辞書で「すでにある単語の解説をもう一度書く」とゆーことをしてしまう。ダメですなー。
・今日のお便り。 |
|
・どうもですー。そういえばマクロの関係ってこともありうるですね。この前 gcc で STL 使ったときにこれでかなり苦戦……。上の方法の他にも、インクルードする前に #define しちゃうとか「プロジェクトの設定」ダイアログの「C/C++」−「一般」ページの「プリプロセッサの定義」でもOKかな。昨日の方、試してみてねー。
・でわまたっ! |
・今日もプログラミングしとらんなー。なんかまずいなー。むー。
・今日のお便り。 |
|
・うーむ、うまくいかないですなー。そういえば、どんな単語が「定義されていない識別子」になるんでしょう。フラグ用定数値か、関数か、とかでも結構ヒントになるかもしんない。あと…… PlatformSDK のダウンロードってどうするんでしょう(爆)。このページから psdk-x86.exe をダウンロードして実行したんだけど、どれをダウンロードしていいのか分からなくて(汗)。やっぱ私英語苦手?(泣)
・でわまたっ! |
・今日はプログラミング辞書書いてました。ってゆーか、なんか「ありますよー」な単語がえらい多いんですけど(汗)。いやねー、辞書のページを infoseek とかに登録したからか、えらいヒット数上がっちゃって、それでどうもいちげんさんが検索と間違えてっていうパターンが多いっぽいです。ちょっととほほ。んでも最近、こうでもしないと追加単語増えないっぽいんで(汗)。
・今日のお便り。 |
|
・そうだっ、その方法をすっかり忘れてたっ!(爆) 実行中リンクしちゃった方がいいかもしれないです。 Win2K と他のウィンドウズとで混成使用もしやすいし。っていうのもねぇ、実際にダウンロードして試してみたんだけど、こちらでもうまくいかなかったです(汗)。
・まず、なぜかインクルードファイルの優先順位が効かなかったです。 VC 側の Winuser.h のファイル名変えてやっと効いたくらい。これが結構謎だなぁ。次に、 AnimateWindow() とかは #if(WINVER >= 0x0500) で囲まれてるから、 WINVER が定義されてないとダメ。しかーし、 MFC 使ってると、どうもこれを外から定義するとうまくいかないっぽいです(泣)。 ・ってゆーか、なんか PlatformSDK のみでのビルドってできないような気がしてきた…… excpt.h とか入ってないし、 VC のと混ぜ合わせて使うとなんか不安だし。やっぱり実行中リンクが一番確実かもしんない、とゆーのが結論かも。あとは、確か Win2K 用 VC が出てたよねぇ、それを使うとか? うむーやっぱ後味悪いかも(汗)。でも実行中リンクは全然問題ないと思うんでしちゃってOKでしょう。うん、お勧め。 ・でわまたっ! |
・重い腰を上げて、ようやっとフリーウェアのバージョンアップに着手しました。しかしながら、なんかめんどい(汗)。初めは新たにワークスペースを作ったんだけど、それじゃかなり時間がかかりそうなんでやめて、前のワークスペースをそのまま持ってきてビルド。そしたら KCL9542 が用意されてなかったんでそれもコピー。
・ビルドして実行、そしたら謎のエラー。スタックフレームを見るとどうやら KCL9542 の問題っぽいんで、 KCL9542 もリビルド。んで実行、おお、実行できた(爆)。ちなみに最初はけしかぶね。けしかぶはフックを使わないからサブ DLL を使わないのと、バグがひとつあるんでそれを取り除く必要があるっていうので。 ・これからは、少しずーつ書き直してく予定。基本的な柱は「 KCL9542 を KTL に移行する」のと「脱 MFC 」。結局は KTL の充実っすね。でもこれがなかなか大変そう。だから少しずつ。フリーウェアにはあんま時間さけないだろうしなー。ってゆーかはまり始めたら時間が一瞬で奪い去られる(汗)。 ・今日のお便り。 |
|
・ええっ!? それって windows.h より先に winuser.h をインクルードしちゃうってことですよね。それってフツーうまくいかないはずなんですが(ってゆーかフツーは windows.h が winuser.h をインクルードしてくれる)。謎だ……。なんかこれはもー泥沼にはまりそうですなぁ。これ以上がんばんない方がいいかも(爆)。
・でわまたっ! |
・けしかぶですが、バグの部分があっさり解決(汗)。「検索リスト」をレジストリに書き込むときに CRecentFileList を使ってたんだけど、 MFC が最近仕様を変えて、書き込むときに「無理矢理ファイル名にする」ようになったんで、検索リストが変になってたとゆーバグ。これを直接レジストリに書き込むようにしただけなんで、かなり楽でした。
・それよりなにより、なんか見れば見るほど、新しく書き換えたくなってしまいますです(爆)。 KString を std::string に置き換えるのとかはもちろん、 CppSL 用に新しくクラスとか作りたい感じ。たとえばコンボボックス用イテレーターとか(爆)。あとレジストリ用バッファクラスとか。 ・例えば「ファイルを開くダイアログ」で複数のファイルを返す仕様にしたい場合。こういう場合にはコンテナへの参照を受け取るようにします。んでもそのコンテナはテンプレート引数化して、どんなコンテナも受け取れるようにします。んで、コンテナへのパスの追加は std::inserter におまかせ! これでどんなコンテナにもパスを追加して返すことができます。 STL を組み込むことでこんなに柔軟な仕様にできるんですねー。 ・インターフェイスを CppSL 化することで、将来他の GUI ライブラリとの共存がすごく楽になると思うんです。今はどんな環境でもコンボボックスがあるけど、 API はそれぞれ違う。だから、イテレーターをひとつ作って、実装部は GUI ライブラリそれぞれで違うようにすれば、使う側はかなり楽になるんではないかなと。 ・とか思ってサンプル作ろうとしたらうまくいかなかった(爆)。だって Win32API 側とか MFC がわとかもアダプタ作んなくちゃいけないんだもの、なんかめんどい(爆)。 POSITION 用イテレーターだけでも作るかなぁ。 ・今日のお便り。 |
|
・おー、さっそくですねー。メンバ関数テンプレートがコンパイルできるとはさすがだ。例外指定とかもばり使えたりすんのかなー。んでもなんか問題あるみたいですなー。 VC7 が当分先って分かってるんだからもちっと気合い入れて作んないもんかね(爆)。それとも VC7 とタメ張るもんじゃないっつー位置づけなのかなぁ、 VB に飽きたら Delphi か BCB みたいな?
・実際の所、フツーに VC 使えるプログラマーにとっては BCB って物足りないとことかあるのかなー。ってゆーか VC って MS 社製品とは思えないいいできなのかも(爆)。なんか VC7 が遅れる理由って、ウィンドウズの新機能用 SDK を装備するためとからしいんで、なんか VC が汚されてくような(爆)。あと数ヶ月したら BeOS5 が雑誌に付いてくるだろうから、そっちに乗り換えようかなー。 ・でわまたっ! |
・今日はぷらとわ書いてました。しかも2話。ここ数話は書くことが決まってるから、書き始めれば3時間で2話くらい完成しちゃいますね。ってゆーか最初1話分の予定だったのがボリューム増えて2話になっただけとゆー(爆)。こうやって増えていく……。ちなみに今日で54話まで完成。51話以降はまずポインタ関係をしっかりしちゃおうと思ってます。
・ポインタ関係を教える上で、 VC ほどすぐれた教材はないです(爆)。なんせメモリビューアで直接アドレス上の値が見られるからねー。「変数に & を付けるとアドレスが分かるんです」「メモリビューアでアドレスの位置を見ましょう」「ほらメモリに値がありますね」みたいな(爆)。難しいと言われてるポインタだけど、こーゆー部分をしっかりやってからならすんなりと憶えられると思うです。 ・あとかなゆ〜を2話。やっとこさ「アプリのツボ」終了。こんな長くなるとは思わなかった上に、なんかあんま意味ない講座だったよーな(汗)。ちょっと最後の方はだるくなっちゃいましたね。ってゆーか作ったことのないもんの解説ってのはやっぱ大変だったと(爆)。ま、終わったからいーや。 ・アプリのツボの次は「オブジェクト指向概略」。「がいりゃく」ってのがミソで、かなり大まかな解説をするつもり。まー結論は「オブジェクト指向って言葉は便利すぎる」みたいになる予定。今の辞書の解説読めば、なんとなく分かるかも。設計者側とプログラマー側の違いが焦点ですな。 ・でわまたっ! |
(C)KAB-studio 2000 ALL RIGHTS RESERVED. |