ページ 1 / 1
これはエラーを出したほうが良いと思います
Posted: 2005年8月02日(火) 19:39
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はまだほとんど出てないかな・・・?)
Posted: 2005年8月02日(火) 22:20
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番台でした。
ウィンドウは、こんな果てしないところに飛んでいったのですね(笑)
Posted: 2005年8月02日(火) 23:29
by Mario2
> たぶん(中略)いのかも…
そうなんですか、また一つ勉強になりました。
> ちなみにリテラル文字列が配置されるアドレスは、こちらの環境では4000000番台でした。
> ウィンドウは、こんな果てしないところに飛んでいったのですね(笑)
そんな果てしないところまで飛んでいたとは・・・・
普通の一般の環境では、表示されなさそうですね(笑)
Posted: 2005年8月03日(水) 00:33
by イグトランス
> たとえば、こんな感じ↓
コード: 全て選択
lstrcpy(bp, "Hello, World!")
lstrcpyの引数はポインタ型として宣言されているから通る、MoveWindowの場合はLongだから通らないようにすべき、と考えませんか?
Posted: 2005年8月03日(水) 05:15
by tak
> lstrcpyの引数はポインタ型として宣言されているから通る、MoveWindowの場合はLongだから通らないようにすべき、と考えませんか?
言われてみれば、僕もそう思います。
実は、上で示したコード
コード: 全て選択
Dim a As Long
Dim b As BytePtr
b = ""
a = b
これは、型チェックに引っかかってコンパイルが通りません。
それはわかっていたのですが、敢えて断りませんでした。
このコードが駄目なのになぜ引数のときは通ってしまうのか?こう尋ねられたら僕には答えられないからです。
でも逆に言えば、このコードが駄目なのなら引数のときもエラーとして通らないようにすべきです。
こういう部分にVer3.xの名残を感じますね。
イグトランス様、ご指摘ありがとうございました。
Posted: 2005年8月03日(水) 09:18
by xsb007
<山本さんへ>
引数、変数ともにエラーではなく警告にするか、キャスト関数(CIntなど)をコンパイラに内蔵してパフォーマンスの低下を伴わずに、Long<->DWord 間の変換ができるようにしたらどうですか。
Posted: 2005年8月03日(水) 18:19
by イグトランス
> <山本さんへ>
> 引数、変数ともにエラーではなく警告にするか、キャスト関数(CIntなど)をコンパイラに内蔵してパフォーマンスの低下を伴わずに、Long<->DWord 間の変換ができるようにしたらどうですか。
これと今回の件はあまり関係がないような気がします。
しかし関数か演算子かはともかく、将来的にはキャストを提供し暗黙の型変換を厳しくするようにすべきだと思います。
Posted: 2005年8月04日(木) 00:42
by 山本
キャストについては、詳細仕様を検討していかなければなりませんね。開発アナウンスのほうにトピックを立てておきました。
http://www.discoversoft.net/forum/viewtopic.php?t=253
Posted: 2005年8月04日(木) 00:54
by Mario2
なんか自分の小さい疑問が段々と大きな話題になってしまっていますね(-_-;)
自分の予想外の方向に話が伸びちゃっていますし。
自分はバグかな?と思っていましたが、(山本さんのBlogを見て)Basicではそんなに型を厳しくチェックしていないみたいですしねぇ・・・
P.S.
山本さんも「水曜どうでしょう」見ているんですね( ^▽^)