ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 17:21

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 
作成者 メッセージ
 記事の件名: HIWORD、LOWORD関係
投稿記事Posted: 2005年9月11日(日) 17:44 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
AB4.1リリースおめでとうございます。
#strictが導入されたので、私も自分のプログラムの不備(変なデータ型に代入していないかとか)をチェックしていました。
そのときに気付いたのが…
コード:
#strict
Dim a As Integer,b As Byte
a=&H1234
b=HIBYTE(a)
このとき、警告が発生してしまうということです。
コード:
#strict
Dim a As Long,b As Integer
a=&H12345678
b=HIWORD(a)
こちらも然り。
マクロ定義を見れば、ビットシフト&論理演算のみで行われているので当然といえば当然なのですが、何とかしていただけたら嬉しいです。

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年9月11日(日) 18:38 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
これらのマクロはByte/Word/DWordを対象にしていると考えるのが自然だと思います。
だからLong/Integerで警告になる現状で良いのではないでしょうか。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年9月11日(日) 18:47 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
肝心の定数関数の定義のほうがキャストに対応できていませんでしたね…。
コード:
Const HIBYTE(w) = (w >> 8) and &HFF
Const LOBYTE(w) = w and &HFF
Const HIWORD(dw) = (dw >> 16) and &HFFFF
Const LOWORD(dw) = dw and &HFFFF

Const MAKEWORD(a,b) = (a and &HFF) or ((b and &HFF)<<8)
Const MAKELONG(a,b) = (a and &HFFFF) or ((b and &HFFFF)<<16)
今までは上記のような定義(function.sbp)でしたが、次回のバージョンアップで下記のものに差し替えようと思います。こうすると、型違いによる警告はでなくなります。
コード:
Const HIBYTE(w) = ((w >> 8) and &HFF) As Byte
Const LOBYTE(w) = (w and &HFF) As Byte
Const HIWORD(dw) = ((dw >> 16) and &HFFFF) As Word
Const LOWORD(dw) = (dw and &HFFFF) As Word

Const MAKEWORD(a,b) = ((a and &HFF) or ((b and &HFF)<<8)) As Word
Const MAKELONG(a,b) = ((a and &HFFFF) or ((b and &HFFFF)<<16)) As Long


通報する
ページトップ
 記事の件名: Re: HIWORD、LOWORD関係
投稿記事Posted: 2005年9月11日(日) 21:15 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
ありがとうございます。
ついでなので、その他の気になった点を…

1. 下のようなコードでも警告されます(^^;
コード:
#strict
Dim a As Integer
a=1
わざわざ 1 As Integer と書くのが本来の書き方なんでしょうか?

2. (RADツール)WM_NOTIFYを処理するとき、lParamからnmHdrにメモリ内容がコピーされますが、memcpyの第2パラメータが型の強制変換とみなされてしまいます(LPARAM→VoidPtrのため)

3. CREATESTRUCTのhInstanceがLong型扱いになっているようで、インスタンスを利用する時に警告されます(^^;; [例: LoadIcon関数など]

4. CreateStatusWindow関数ですが、戻り値はHWND型にしたほうがいいのではないでしょうか… CreateFile関数の戻り値もHANDLE型、CreateDialogの戻り値もHWND型でお願いします(^^;

5. (RADツール)DialogBox関数(プロシージャ?)の内部処理でサブクラス化されるときにAddressOf関数の部分が警告の対象になります。

6. Val関数の内部、TempPtr=i3 (2箇所)が警告になります。

7. Left$関数などの内部処理で、memcpyの第1引数が警告されます。

8. NMLISTVIEW構造体で、.hdr.hwndFromがDWord型になっているために警告が出ます。

9. SendDlgItemMessage関数の第1引数もHWND型にしてください。

以上、AucMonを#strict付きでコンパイルしたときに出てくる内部処理関連の警告です。
自分で定義ファイルをいじって何とかなる部分もありますが、特に2. と 4.のCreateDialog、それに5. については自分ではどうしようもない部分があるもので…。
※ヘタにいじってバグを作っても嫌なので(^^;;;

>イグトランスさん
コード:
#strict
Dim a As DWord,b As Word
a=&H12345678
b=HIWORD(a)

これでも警告になりました。
結局のところ、私がこの件で言いたいのはResizeイベントやMouseMoveイベントを発生させる内部の過程で強制変換が起こるということです(爆

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
 記事の件名: Re: HIWORD、LOWORD関係
投稿記事Posted: 2005年9月11日(日) 21:35 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
> >イグトランスさん
>
コード:
#strict
> Dim a As DWord,b As Word
> a=&H12345678
> b=HIWORD(a)
> これでも警告になりました。
> 結局のところ、私がこの件で言いたいのはResizeイベントやMouseMoveイベントを発生させる内部の過程で強制変換が起こるということです(爆

そういうことですか。よく確かめもせず書いてしまい失礼しました。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年9月11日(日) 22:35 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
引用:
1. 下のようなコードでも警告されます(^^;
コード:
#strict
Dim a As Integer
a=1
わざわざ 1 As Integer と書くのが本来の書き方なんでしょうか?
すみません、AB側のバグです。コンパイラは演算結果がリテラル値であると認識したとき、そのリテラル値の範囲と左辺のデータ型をチェックし、警告するかどうかを判断していますが、その部分のコードに手違いがありました。次回のバージョンアップで修正しますので、今しばらくお待ちください。

引用:
2. (RADツール)WM_NOTIFYを処理するとき、lParamからnmHdrにメモリ内容がコピーされますが、memcpyの第2パラメータが型の強制変換とみなされてしまいます(LPARAM→VoidPtrのため)

3. CREATESTRUCTのhInstanceがLong型扱いになっているようで、インスタンスを利用する時に警告されます(^^;; [例: LoadIcon関数など]

4. CreateStatusWindow関数ですが、戻り値はHWND型にしたほうがいいのではないでしょうか… CreateFile関数の戻り値もHANDLE型、CreateDialogの戻り値もHWND型でお願いします(^^;

5. (RADツール)DialogBox関数(プロシージャ?)の内部処理でサブクラス化されるときにAddressOf関数の部分が警告の対象になります。

6. Val関数の内部、TempPtr=i3 (2箇所)が警告になります。

7. Left$関数などの内部処理で、memcpyの第1引数が警告されます。

8. NMLISTVIEW構造体で、.hdr.hwndFromがDWord型になっているために警告が出ます。

9. SendDlgItemMessage関数の第1引数もHWND型にしてください。


詳細なご指摘、ありがとうございます。すべて次回のバージョンアップで修正します。この他にも、ライブラリまで手が回らなかった部分があるかと思いますので、発見次第、ご連絡いただけると助かります。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年9月16日(金) 17:15 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
>この他にも、ライブラリまで手が回らなかった部分があるかと思いますので、発見次第、ご連絡いただけると助かります。

と書いてありましたので、
api_system.sbp内の
Declare Function MultiByteToWideChar Lib "kernel32" (CodePage As DWord, dwFlags As DWord, lpMultiByteStr As BytePtr, cchMultiByte As Long, lpWideCharStr As WordPtr, cchWideChar As Long) As Long
で第5引数(と言う言い方であってるかな・・・)のlpWideCharStr As WordPtrで、ソースによってはWordPtrをStringに書き換えないと動作しないプログラムがあったりします。
検索エンジンで調べてみましたが、ほとんどがStringと書かれていました。
一応報告しておきます。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年9月16日(金) 22:55 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
> で第5引数(と言う言い方であってるかな・・・)のlpWideCharStr As WordPtrで、ソースによってはWordPtrをStringに書き換えないと動作しないプログラムがあったりします。
> 検索エンジンで調べてみましたが、ほとんどがStringと書かれていました。
それはVBではないですか?VBのStringはUnicodeなのでそうするのが逆に正しくなります。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年9月17日(土) 10:15 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
> それはVBではないですか?VBのStringはUnicodeなのでそうするのが逆に正しくなります。
そうなのですか?
それは失礼しました。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], Semrush [Bot] & ゲスト[11人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean