Select Case [String型]でコンパイラが落ちる

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

Select Case [String型]でコンパイラが落ちる

#1 投稿記事 by Mario2 »

たとえば、

コード: 全て選択

Dim a AS String
Select Case a
End Select
だけでも、コンパイル中にコンパイラが落ちてしまいます。
Ver4.24では未発生で、Ver5.00CP3で発生します。

ちなみに、aが*Byte型(BytePtr型)では、正しく処理されてない()ような気がするのですが、仕様でしたっけ?(こちらはVer4.24 ・ Ver5.00CP3両方で確認。)

もし、こちら側(ソース)のミスだったらすいませんm(_ _)m
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

別報告になるのですが・・・

#2 投稿記事 by Mario2 »

さっき発見したバグ(?)なのですが、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 イグトランス »

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 »

あ・・・・・ごめんなさい。色々と抜けてました。

コード: 全て選択

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 イグトランス »

ところでSecToHourはZeroStringして書き込む領域を用意していないようですが大丈夫ですか?
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#6 投稿記事 by Mario2 »

あ、それは大丈夫です。またここに書くのは忘れてましたけど・・・--;;;
SecToHour=ZeroString(8)
をwsprintfの前に書いています。

ふと思ったのですが、ZeroString(大まかに言えば書き込む領域の確保)って文字数が決まっていたらその最大文字数まで(さっきのソースの場合は8バイト)の確保で大丈夫なのでしょうか?それとも、念のため(?)に最大文字数+1とか"MAX_PATH"とかにした方がよいのでしょうか。?


バク報告板なのに質問してすいませんm(_ _)m
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#7 投稿記事 by Mario2 »

と、今他の書き込みを見ていたら、
Select Case [String型]のバグは
http://www.activebasic.com/forum/viewtopic.php?t=1586
で報告済みだったんですね。よく見てませんでした。
返信する