たとえば、
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はまだほとんど出てないかな・・・?)
これはエラーを出したほうが良いと思います
-
- 記事: 162
- 登録日時: 2005年5月31日(火) 07:49
たぶんこれは、文字列を文字列へのポインタに読み替えているために起きるのではないかと思います。
ポインタは4バイト、Long型も4バイトなので、長さの上では衝突しませんよね。これが通らないのは、コンパイラの型チェックによるものです。
このときは "" が文字列として扱われている点に注意してください。
しかし、引数になると話は変わります。
引数の場合、文字列リテラルを直接渡すことがありますよね。
たとえば、こんな感じ↓
それを考慮して、引数に文字列を渡すときはポインタとして扱われるのだと思います。
つまり、次のようなことをコンパイラがしているというわけです。
> 宣言では、2つともLong型で、通常はコンパイルは通らないと思うので、コンパイラで、「MainWnd.sbp(***) - 型が違います」等のエラーを出したほうが、初心者的には分かりやすいかな、と思います。
こちらの方が親切と言えるでしょうね。
というか、本来こうしなければならないのかも…
ちなみにリテラル文字列が配置されるアドレスは、こちらの環境では4000000番台でした。
ウィンドウは、こんな果てしないところに飛んでいったのですね(笑)
ポインタは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番台でした。
ウィンドウは、こんな果てしないところに飛んでいったのですね(笑)
-
- 記事: 205
- 登録日時: 2005年5月31日(火) 13:31
- お住まい: 大阪市
-
- 記事: 162
- 登録日時: 2005年5月31日(火) 07:49
> lstrcpyの引数はポインタ型として宣言されているから通る、MoveWindowの場合はLongだから通らないようにすべき、と考えませんか?
言われてみれば、僕もそう思います。
実は、上で示したコードこれは、型チェックに引っかかってコンパイルが通りません。
それはわかっていたのですが、敢えて断りませんでした。
このコードが駄目なのになぜ引数のときは通ってしまうのか?こう尋ねられたら僕には答えられないからです。
でも逆に言えば、このコードが駄目なのなら引数のときもエラーとして通らないようにすべきです。
こういう部分にVer3.xの名残を感じますね。
イグトランス様、ご指摘ありがとうございました。
言われてみれば、僕もそう思います。
実は、上で示したコード
コード: 全て選択
Dim a As Long
Dim b As BytePtr
b = ""
a = b
それはわかっていたのですが、敢えて断りませんでした。
このコードが駄目なのになぜ引数のときは通ってしまうのか?こう尋ねられたら僕には答えられないからです。
でも逆に言えば、このコードが駄目なのなら引数のときもエラーとして通らないようにすべきです。
こういう部分にVer3.xの名残を感じますね。
イグトランス様、ご指摘ありがとうございました。
-
- 記事: 899
- 登録日時: 2005年5月31日(火) 17:59
- お住まい: 東京都
-
- Site Admin
- 記事: 535
- 登録日時: 2005年5月30日(月) 15:08
キャストについては、詳細仕様を検討していかなければなりませんね。開発アナウンスのほうにトピックを立てておきました。
http://www.discoversoft.net/forum/viewtopic.php?t=253
http://www.discoversoft.net/forum/viewtopic.php?t=253
-
- 記事: 205
- 登録日時: 2005年5月31日(火) 13:31
- お住まい: 大阪市