- ベストアンサー
猫でも 20章
LRESULTはlong型、DWORDはmsdnより、「32 ビットの符号なし整数、またはセグメント アドレスとそれに関連するオフセット」、SendMessageは返り値はLRESULT型。それで、猫でもわかるプログラミング20章(http://www.kumei.ne.jp/c_lang/sdk/sdk_20.htm)、の上のほうにリスト等の情報を取得するのに、 int getDlg(HWND hDlgWnd) { GetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT1), edit_str, sizeof(edit_str)); ScrPos = GetScrollPos(GetDlgItem(hDlgWnd, IDC_SCROLL1), SB_CTL); ListNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_LIST1), LB_GETCURSEL, 0L, 0L); ComboNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_COMBO1), CB_GETCURSEL, 0L, 0L); return 0; } とあるのですが、SendMessageを(int)(DWORD)とキャストしているのはなぜなんでしょうか。(int)ではダメですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
プログラムそのものが、コンパイラ依存に見えてしょうがあません。 intの大きさに関しては、Cの規約によれば、定義されていません。型の大きさが、short <= int <= long を満たしていれば、 後は、コンパイラーの作者がコンパイラーを作りやすいように勝手に決めて良いことになってます。(本来は、もう少し条件がありますが) というわけで、intの変数に32ビットの符号無し整数が格納できるかどうかは、その時に使用するコンパイラー次第と言うことになります。 普通は、32ビットのCPUを使用したときには、32ビットの数値が一番使いやすいので、最近のwindows環境では、intは32ビットの符号付き整数となることが多いと思いますので、多分、そのプログラム符号のせいで少々面倒なことになるかも・・・ですね。(たとえば、ListNoの大小を比較は単純にはできません。) せめて、(unsigned int)ならば、まだ動く確率は大きいですが・・・それでも、まだコンパイラ依存です。 この教訓は・・・windows APIとのやりとりを行う変数は、極力、SDKで定義されたtypedefを使用することです。外部とのやりとりのため、どうしようもないときだけ、DWORDだとunsigned longに変換。数値の大きさが絶対に保証できるときに限り、コンパイラ依存を覚悟でそれ以下の大きさの型にする・・・でしょうか。 intやlongの大きさが絡む問題は、注意が必要です。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
なぜでしょうね? intでキャストして問題ないはずですけど。 というか、ListNoとComboNo、本来はlongであるべきなんですけど・・・ あくまでサンプルということで、すべて鵜呑みにするのは良くないということですね。
お礼
そうなんですか~。 少し安心しました。ありがとうございます
お礼
経験も浅いため、少し私には理解するのに時間がかかりそうですが、また後ほど読み返してみたいと思います。詳しく考察していただき、ありがとうございます。