ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 16:24

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




新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年8月02日(火) 19:39 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
たとえば、
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 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
たぶんこれは、文字列を文字列へのポインタに読み替えているために起きるのではないかと思います。
ポインタは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 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
> たぶん(中略)いのかも…
そうなんですか、また一つ勉強になりました。

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

そんな果てしないところまで飛んでいたとは・・・・
普通の一般の環境では、表示されなさそうですね(笑)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年8月03日(水) 00:33 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
> たとえば、こんな感じ↓
コード:
lstrcpy(bp, "Hello, World!")
lstrcpyの引数はポインタ型として宣言されているから通る、MoveWindowの場合はLongだから通らないようにすべき、と考えませんか?


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年8月03日(水) 05:15 
オフライン

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

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

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


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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年8月03日(水) 09:18 
<山本さんへ>
引数、変数ともにエラーではなく警告にするか、キャスト関数(CIntなど)をコンパイラに内蔵してパフォーマンスの低下を伴わずに、Long<->DWord 間の変換ができるようにしたらどうですか。


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

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

これと今回の件はあまり関係がないような気がします。
しかし関数か演算子かはともかく、将来的にはキャストを提供し暗黙の型変換を厳しくするようにすべきだと思います。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年8月04日(木) 00:42 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
キャストについては、詳細仕様を検討していかなければなりませんね。開発アナウンスのほうにトピックを立てておきました。

http://www.discoversoft.net/forum/viewtopic.php?t=253


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年8月04日(木) 00:54 
オフライン

登録日時: 2005年5月31日(火) 13:31
記事: 205
お住まい: 大阪市
なんか自分の小さい疑問が段々と大きな話題になってしまっていますね(-_-;)
自分の予想外の方向に話が伸びちゃっていますし。
自分はバグかな?と思っていましたが、(山本さんのBlogを見て)Basicではそんなに型を厳しくチェックしていないみたいですしねぇ・・・


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


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

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


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[6人]


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

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