by のぶあや » 2006年11月06日(月) 22:42
>>SetTimer(hMainWnd,1,1000,AddressOf(Timer)) =
>> MainWnd.sbp(46) - [警告] "SetTimer"の第4パラメータが、VoidPtrからDWordに強制変換されています。
>これは"警告"なので一応大丈夫です。
補足ですが、DWord型にキャストすることで[警告]が消せます。
コード: 全て選択
SetTimer(hMainWnd,1,1000,AddressOf(Timer) As DWord)
これはDWord型(32bit整数値)の引数に関数ポインタ(32bit)を代入しているということで、コンパイラが「型が違うのでバグではないか?」とユーザーに警告しているのです。
今回の場合は両方とも32bit整数値で表されているので問題ないのですが、Word型(16bit整数値)にDWord型(32bit整数値)を代入したり、Long型(符号付32bit整数値)に符号無32bit整数値を代入したりする場合は、正常に代入されない場合があります(処理としては正常に行われる)。
前者(Word=DWord)の例え
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim _DWord As DWord, _Word As Word
_DWord=65537
_Word=_DWord
OutputDebugString2(Str$(_DWord))
OutputDebugString2(Str$(_Word))
とした場合、デバッグウィンドウには
と表示されます。
65537を16進数で表すと「01 00 01」となり、それぞれの型に代入をすると
DWord型 00 01 00 01=65537(正常に代入される)
Word型 ** ** 00 01=1(16bitしかないため、*の部分の数値は切り捨てられる)
となるからです。
後者の例え
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim _DWord As DWord, _Long As Long
_DWord=2147483648
_Long=_DWord
OutputDebugString2(Str$(_DWord))
OutputDebugString2(Str$(_Long))
とした場合、デバッグウィンドウには
コード: 全て選択
2147483648
-2147483648
と表示されます。
2147483648を2進数で表すと「10000000 00000000 00000000 00000000」となり、それぞれの型に代入をすると
DWord型 10000000 00000000 00000000 00000000(負数は無いので正常)
Long型 10000000 00000000 00000000 00000000(最上位ビットは負数を意味するので数値が壊れる)
となるからです。
この説明では分かりづらいかも知れないので「2進数 負数」、「2進数 補数」などで検索すると分かりやすい説明が見つかると思います。
>>SetTimer(hMainWnd,1,1000,AddressOf(Timer)) =
>> MainWnd.sbp(46) - [警告] "SetTimer"の第4パラメータが、VoidPtrからDWordに強制変換されています。
>これは"警告"なので一応大丈夫です。
補足ですが、DWord型にキャストすることで[警告]が消せます。
[code]SetTimer(hMainWnd,1,1000,AddressOf(Timer) As DWord)[/code]
これはDWord型(32bit整数値)の引数に関数ポインタ(32bit)を代入しているということで、コンパイラが「型が違うのでバグではないか?」とユーザーに警告しているのです。
今回の場合は両方とも32bit整数値で表されているので問題ないのですが、Word型(16bit整数値)にDWord型(32bit整数値)を代入したり、Long型(符号付32bit整数値)に符号無32bit整数値を代入したりする場合は、正常に代入されない場合があります(処理としては正常に行われる)。
前者(Word=DWord)の例え[hide][code]Dim _DWord As DWord, _Word As Word
_DWord=65537
_Word=_DWord
OutputDebugString2(Str$(_DWord))
OutputDebugString2(Str$(_Word))[/code]
とした場合、デバッグウィンドウには[code]65537
1[/code]
と表示されます。
65537を16進数で表すと「01 00 01」となり、それぞれの型に代入をすると
DWord型 00 01 00 01=65537(正常に代入される)
Word型 ** ** 00 01=1(16bitしかないため、*の部分の数値は切り捨てられる)
となるからです。[/hide]
後者の例え[hide][code]Dim _DWord As DWord, _Long As Long
_DWord=2147483648
_Long=_DWord
OutputDebugString2(Str$(_DWord))
OutputDebugString2(Str$(_Long))[/code]
とした場合、デバッグウィンドウには[code]2147483648
-2147483648[/code]
と表示されます。
2147483648を2進数で表すと「10000000 00000000 00000000 00000000」となり、それぞれの型に代入をすると
DWord型 10000000 00000000 00000000 00000000(負数は無いので正常)
Long型 10000000 00000000 00000000 00000000(最上位ビットは負数を意味するので数値が壊れる)
となるからです。
この説明では分かりづらいかも知れないので「2進数 負数」、「2進数 補数」などで検索すると分かりやすい説明が見つかると思います。[/hide]