ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
Mario2
記事: 205 登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:
#1
投稿記事
by Mario2 » 2006年10月04日(水) 17:07
たとえば、
コード: 全て選択
Dim a AS String
Select Case a
End Select
だけでも、コンパイル中にコンパイラが落ちてしまいます。
Ver4.24では未発生で、Ver5.00CP3で発生します。
ちなみに、aが*Byte型(BytePtr型)では、正しく処理されてない(
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします] 以下の様なソースの場合、Case Elseの処理が行われます。
コード: 全て選択
Dim b As *Byte
b=".mp3"
Select Case b
Case ".ogg"
msgbox 0,"0"
Case ".mp3"
msgbox 0,"1"
Case ".wav"
msgbox 0,"2"
Case Else
msgbox 0,"3"
End Select
(本文(?)に"3"と書かれたダイアログが出る)
ちなみに、bをMakeStr(b)にしてもコンパイラが落ちました。
)ような気がするのですが、仕様でしたっけ?(こちらはVer4.24 ・ Ver5.00CP3両方で確認。)
もし、こちら側(ソース)のミスだったらすいませんm(_ _)m
Mario2
記事: 205 登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:
#2
投稿記事
by Mario2 » 2006年10月04日(水) 22:23
さっき発見したバグ(?)なのですが、wsprintf()の動作がおかしいです。AB5.00CP3で確認。
動作がおかしいと言うか、たとえば、
wsprintf(SecToHour,"%02s:%02s:%02s",Str$(Hour),Str$(Minute),Str$(Second))
だと、普通に"11:22:33"とかになるのですが、これを5.00CP3で実行すると、"-@:<^:\]"みたいに"%02s"の部分が文字化けしてしまってます。
新String型の影響なのかどうかわかりませんが、調査お願いします。
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#3
投稿記事
by イグトランス » 2006年10月04日(水) 22:57
wsprintfの方はどうしようもないと思います。
StrPtrなどを使って*Byteへ変換することを明示してやるしかないと思います。
例: wsprintf(SecToHour, "%02s:%02s:%02s", StrPtr(Str$(Hour)), StrPtr(Str$(Minute)), StrPtr(Str$(Second)))
なんでこうなるかというと,通常*Byteを引数に取ると宣言されている関数にString型のインスタンスを渡すと*Byteへ変換されますが,
wsprintfは可変個の引数を取るという性質上,どんな引数を取るか全く指定されていません。
だからString型のインスタンスを渡すと,*Byteへの変換が行われないまま生のStringが渡されてしまい,おかしなことになってしまうのです。
Mario2
記事: 205 登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:
#4
投稿記事
by Mario2 » 2006年10月05日(木) 00:02
あ・・・・・ごめんなさい。色々と抜けてました。
コード: 全て選択
Dim SecToHour As String
Dim Hour As Long
Dim Minute As Long
Dim Second As Long
Hour=2
Minute=29
Second=10
wsprintf(SecToHour,"%02s:%02s:%02s",Str$(Hour),Str$(Minute),Str$(Second))
ってソースで、AB4.24時には正常ですが、5.00CP3ではおかしな文字列が帰るのです。
でも、wsprintf()の件はイグトランスさんの説明で、なぜこういうことになったのか、等々がわかりました。あと"例:"のコードで正常表示されました。ありがとうございます。
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#5
投稿記事
by イグトランス » 2006年10月05日(木) 00:11
ところでSecToHourはZeroStringして書き込む領域を用意していないようですが大丈夫ですか?
Mario2
記事: 205 登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:
#6
投稿記事
by Mario2 » 2006年10月05日(木) 16:39
あ、それは大丈夫です。またここに書くのは忘れてましたけど・・・--;;;
SecToHour=ZeroString(8)
をwsprintfの前に書いています。
ふと思ったのですが、ZeroString(大まかに言えば書き込む領域の確保)って文字数が決まっていたらその最大文字数まで(さっきのソースの場合は8バイト)の確保で大丈夫なのでしょうか?それとも、念のため(?)に最大文字数+1とか"MAX_PATH"とかにした方がよいのでしょうか。?
バク報告板なのに質問してすいませんm(_ _)m