strictと、代入時期についての質問

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: strictと、代入時期についての質問

Re: strictと、代入時期についての質問

by 総一郎 » 2006年1月16日(月) 16:45

イグトランスさん、konisiさん、返信ありがとうございます。

SendDlgItemMessageなんて物があったんですね。
知りませんでした。

キャストって言えば

by konisi » 2006年1月15日(日) 00:19

String型がキャストできないのが残念です。お蔭様でcommand.sbp、Callback.wbp、function.sbp等でかなりの数の警告が検出されます^^;

by イグトランス » 2006年1月14日(土) 22:48

ところでSendMessage(GetDlgItemよりもSendDlgItemMessageという関数があります。
こちらを使ってはどうでしょうか。

Re: strictと、代入時期についての質問

by 総一郎 » 2006年1月14日(土) 17:29

hiraさん、返信ありがとうございます。

なるほど。違いがないなら一行で済むし、使う変数も減らせるので、
これからは以下の形式にします。

コード: 全て選択

intVal = SendMessage(GetDlgItem(hMainWnd,ComboBox8),CB_GETCURSEL,0,0) 
強制変換は、ただ、違う型間でデータをやり取りしたという話なのか。
「データが失われる」というのも良く分かりました。
上限を超える様な使い方もしてないし、無視しても大丈夫なんですね。

そんなに大きな問題では無い事が分かって安心しました。
ありがとうございました。

Re: strictと、代入時期についての質問

by hira » 2006年1月13日(金) 19:25

総一郎さんの示されたコードですが、実質的には違いはありません。
しかし、1度変数に戻り値を格納してから引数に指定すると、引数の型が間違っていた場合に予想外の結果になることがあります(例えば10万までの整数を返す可能性のある関数について、戻り値をWordに格納したなど)。
それから#strictについてですが、「データが失われる」とは次のような状況です。

コード: 全て選択

Function test(n As DWord) As DWord
    test=n*2
End Function

Dim a As Word
a=test(2000)
このようなコードは、最後の行で警告が出ます。
これはDWord→Wordへの強制変換で、上の例ではaは4000となります。
しかし、例えば引数が50000のとき、aに入る値は34464となってしまいます(計算結果がWord型の値の上限である65535を超えるため)。
「データが失われる」とはこういうことなのですが、もちろん引数に大きな値を指定しなければ全く問題ありませんので、
キャストをするなどして対応してください(要するにコンパイラに「これは意図した動作ですよ」と言ってあげるわけですね)。

strictと、代入時期についての質問

by 総一郎 » 2006年1月13日(金) 13:02

凄く基本的な質問なのですが、検索しても良く分からなかったので質問します。

「厳密な型チェックを行う(#strict指定)」、は今まで使ってなかったのですが、
試しにチェックしてみると、100件以上の警告が出ました。
ほとんどが「強制変換されている」というもので、数件「データが失われる可能性」とありました。
しかし、作ったソフトは、何の問題もなく思った通りに動いてくれてます。
そもそも、この警告というのは直さないとどうなるのでしょう?
ある特定条件下では、不具合を起こしたりするのでしょうか?

二つ目の質問です。
以下の二つはどちらでも、動作に問題はありません。
ですが、他の人のサンプルをみると、どちらの記述法もあります。
勿論、GetDlgItemやハンドルだけに限らない話です。
つまり、変数に取得した物を入れといて、新たに式に入れる物と、
取得しつつ、同時に式に入れてる物の違いはあるのかという質問です。

コード: 全て選択

	handl = GetDlgItem(hMainWnd,ComboBox8)
	intVal = SendMessage(handl,CB_GETCURSEL,0,0)
と、
	intVal = SendMessage(GetDlgItem(hMainWnd,ComboBox8),CB_GETCURSEL,0,0)
どなたか、この事に関して教えてくれると幸いです。お願いします。

ページトップ