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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
総一郎

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

#1 投稿記事 by 総一郎 »

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

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

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

コード: 全て選択

	handl = GetDlgItem(hMainWnd,ComboBox8)
	intVal = SendMessage(handl,CB_GETCURSEL,0,0)
と、
	intVal = SendMessage(GetDlgItem(hMainWnd,ComboBox8),CB_GETCURSEL,0,0)
どなたか、この事に関して教えてくれると幸いです。お願いします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

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

#2 投稿記事 by hira »

総一郎さんの示されたコードですが、実質的には違いはありません。
しかし、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を超えるため)。
「データが失われる」とはこういうことなのですが、もちろん引数に大きな値を指定しなければ全く問題ありませんので、
キャストをするなどして対応してください(要するにコンパイラに「これは意図した動作ですよ」と言ってあげるわけですね)。
総一郎

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

#3 投稿記事 by 総一郎 »

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

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

コード: 全て選択

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

そんなに大きな問題では無い事が分かって安心しました。
ありがとうございました。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

ところでSendMessage(GetDlgItemよりもSendDlgItemMessageという関数があります。
こちらを使ってはどうでしょうか。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

キャストって言えば

#5 投稿記事 by konisi »

String型がキャストできないのが残念です。お蔭様でcommand.sbp、Callback.wbp、function.sbp等でかなりの数の警告が検出されます^^;
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
総一郎

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

#6 投稿記事 by 総一郎 »

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

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