これはエラーを出したほうが良いと思います

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

これはエラーを出したほうが良いと思います

#1 投稿記事 by Mario2 »

たとえば、
MoveWindow(hMainWnd,0,0,299,405,TRUE)
が通常の使い方ですが、
MoveWindow(hMainWnd,"","",299,405,TRUE)
と言う風に長さ0の文字列を指定しても、コンパイルが通ります。
宣言では、2つともLong型で、通常はコンパイルは通らないと思うので、コンパイラで、「MainWnd.sbp(***) - 型が違います」等のエラーを出したほうが、初心者的には分かりやすいかな、と思います。(ちなみに、
Dim a As Long
a=""
ではちゃんとエラーを返します。)

ちなみに、MoveWindow(hMainWnd,"","",299,405,TRUE)のまま使うと、ウィンドウがどっかにいっちゃいます。(・_・; タスクバーから右クリックして終了させないと、終了できません。(タスクマネージャ以外で)
自分はウィンドウの大きさを変えたかっただけですけどね・・・・

管理人様、AB4.0VerUpと共に、AB5.0の開発、がんばってください。(って言っても、64bitはまだほとんど出てないかな・・・?)
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#2 投稿記事 by tak »

たぶんこれは、文字列を文字列へのポインタに読み替えているために起きるのではないかと思います。
ポインタは4バイト、Long型も4バイトなので、長さの上では衝突しませんよね。

コード: 全て選択

Dim a As Long
a = ""
これが通らないのは、コンパイラの型チェックによるものです。
このときは "" が文字列として扱われている点に注意してください。
しかし、引数になると話は変わります。
引数の場合、文字列リテラルを直接渡すことがありますよね。

たとえば、こんな感じ↓

コード: 全て選択

lstrcpy(bp, "Hello, World!")
それを考慮して、引数に文字列を渡すときはポインタとして扱われるのだと思います。
つまり、次のようなことをコンパイラがしているというわけです。

コード: 全て選択

Dim a As Long
Dim b As BytePtr
b = ""
a = b

> 宣言では、2つともLong型で、通常はコンパイルは通らないと思うので、コンパイラで、「MainWnd.sbp(***) - 型が違います」等のエラーを出したほうが、初心者的には分かりやすいかな、と思います。

こちらの方が親切と言えるでしょうね。
というか、本来こうしなければならないのかも…

ちなみにリテラル文字列が配置されるアドレスは、こちらの環境では4000000番台でした。
ウィンドウは、こんな果てしないところに飛んでいったのですね(笑)
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#3 投稿記事 by Mario2 »

> たぶん(中略)いのかも…
そうなんですか、また一つ勉強になりました。

> ちなみにリテラル文字列が配置されるアドレスは、こちらの環境では4000000番台でした。
> ウィンドウは、こんな果てしないところに飛んでいったのですね(笑)

そんな果てしないところまで飛んでいたとは・・・・
普通の一般の環境では、表示されなさそうですね(笑)
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

> たとえば、こんな感じ↓

コード: 全て選択

lstrcpy(bp, "Hello, World!")
lstrcpyの引数はポインタ型として宣言されているから通る、MoveWindowの場合はLongだから通らないようにすべき、と考えませんか?
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#5 投稿記事 by tak »

> lstrcpyの引数はポインタ型として宣言されているから通る、MoveWindowの場合はLongだから通らないようにすべき、と考えませんか?

言われてみれば、僕もそう思います。

実は、上で示したコード

コード: 全て選択

Dim a As Long
Dim b As BytePtr
b = ""
a = b
これは、型チェックに引っかかってコンパイルが通りません。
それはわかっていたのですが、敢えて断りませんでした。
このコードが駄目なのになぜ引数のときは通ってしまうのか?こう尋ねられたら僕には答えられないからです。
でも逆に言えば、このコードが駄目なのなら引数のときもエラーとして通らないようにすべきです。
こういう部分にVer3.xの名残を感じますね。


イグトランス様、ご指摘ありがとうございました。
xsb007

#6 投稿記事 by xsb007 »

<山本さんへ>
引数、変数ともにエラーではなく警告にするか、キャスト関数(CIntなど)をコンパイラに内蔵してパフォーマンスの低下を伴わずに、Long<->DWord 間の変換ができるようにしたらどうですか。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

> <山本さんへ>
> 引数、変数ともにエラーではなく警告にするか、キャスト関数(CIntなど)をコンパイラに内蔵してパフォーマンスの低下を伴わずに、Long<->DWord 間の変換ができるようにしたらどうですか。

これと今回の件はあまり関係がないような気がします。
しかし関数か演算子かはともかく、将来的にはキャストを提供し暗黙の型変換を厳しくするようにすべきだと思います。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#8 投稿記事 by 山本 »

キャストについては、詳細仕様を検討していかなければなりませんね。開発アナウンスのほうにトピックを立てておきました。

http://www.discoversoft.net/forum/viewtopic.php?t=253
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#9 投稿記事 by Mario2 »

なんか自分の小さい疑問が段々と大きな話題になってしまっていますね(-_-;)
自分の予想外の方向に話が伸びちゃっていますし。
自分はバグかな?と思っていましたが、(山本さんのBlogを見て)Basicではそんなに型を厳しくチェックしていないみたいですしねぇ・・・


P.S.
山本さんも「水曜どうでしょう」見ているんですね( ^▽^)
返信する