INPUT命令(N88BASICモード)にてSTRING型強制終了

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
たかせ
記事: 215
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

INPUT命令(N88BASICモード)にてSTRING型強制終了

#1 投稿記事 by たかせ »

たかせです。
v05cp3にて
INPUT命令(N88BASICモード)にてSTRING型のデータだと強制終了します。
#prompt
'ps
'#consoleにすると
'dos_console.sbp(72) - "_System_HeapStringFree" 無効な識別子です
'dos_console.sbp(73) - "_System_HeapStringAlloc" 無効な識別子です
'というエラーが出てコンパイルが中断します。
DIM BYTEDATA AS BYTE
DIM CHARDATA AS CHAR
DIM INTEDATA AS INTEGER
DIM LONGDATA AS LONG
DIM SIGLDATA AS SINGLE
DIM DOBLDATA AS DOUBLE
DIM STRGDATA AS String
INPUT "BYTE = ",BYTEDATA
PRINT "BYTE =";BYTEDATA
INPUT "CHRA = ",CHARDATA
PRINT "CHRA =";CHARDATA
INPUT "INTE = ",INTEDATA
PRINT "INTE =";INTEDATA
INPUT "LONG = ",LONGDATA
PRINT "LONG =";LONGDATA
INPUT "SIGL = ",SIGLDATA
PRINT "SIGL =";SIGLDATA
INPUT "DOBL = ",DOBLDATA
PRINT "DOBL =";DOBLDATA
'INPUT "STRG = ",STRGDATA
STRGDATA = ZeroString(20)
STRINPUT(STRGDATA)
PRINT "STRG =";STRGDATA
Input$(1)
SUB STRINPUT(O1 AS *BYTE)
DIM DUMMY AS BYTE
INPUT "STRG = ",DUMMY
'FillMemory(StrPtr(STRGDATA),20,32)
lstrcpy(O1,_PromptSys_InputStr)
END SUB
END
ご確認願います。
ちなみに
#consoleにすると
dos_console.sbp(72) - "_System_HeapStringFree" 無効な識別子です
dos_console.sbp(73) - "_System_HeapStringAlloc" 無効な識別子です
というエラーが出てコンパイルが中断します。
たかせ
記事: 215
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

追記

#2 投稿記事 by たかせ »

たかせです。
該当箇所コメントはずしてみてください。
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#3 投稿記事 by OverTaker »

Ver.5.0 での#N88BASIC,#prompt,#consoleの対応状況については、現在遅れている状態です。
いずれ対応するのだとは思いますが、安全に使用したいのなら、4.0以前のActiveBasicを使うことをお勧めします。

ところで、#N88BASICと#promptは指定するだけでアクセス違反になるのですが、うちの環境だけでしょうか?
たかせ
記事: 215
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

#4 投稿記事 by たかせ »

> Ver.5.0 での#N88BASIC,#prompt,#consoleの対応状況については、現在遅れている状態です。
> いずれ対応するのだとは思いますが、安全に使用したいのなら、4.0以前のActiveBasicを使うことをお勧めします。
了解しました。ありがとううございます。

ところで、9月24に投稿された件も同様ですね。

>
> ところで、#N88BASICと#promptは指定するだけでアクセス違反になるのですが、うちの環境だけでしょうか?

すみません意味がいまいちよくわかりませんが、
自分のPCでのみしか確認していません。

PCはWIN-XP,1.5Ghz,256MBです。
見当違いならごめんなさい。
最後に編集したユーザー たかせ [ 2011年2月26日(土) 13:43 ], 累計 1 回
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#5 投稿記事 by OverTaker »

Ver.5.0 での#N88BASIC,#prompt,#consoleの対応状況については、現在遅れている状態です。
いずれ対応するのだとは思いますが、安全に使用したいのなら、4.0以前のActiveBasicを使うことをお勧めします。

ところで、#N88BASICと#promptは指定するだけでアクセス違反になるのですが、うちの環境だけでしょうか?
すみません。やっぱりこの投稿は訂正させていただきます。

もう一度CP3をダウンロードして、きちんと上書きできているか確認してみてください。
もし、それでもおかしい場合はよくわかりません。というのも、うちのXP Home x86 SP2で#N88BASICまたは#consoleを書いただけのプログラムを実行しますと、アクセス違反が起きてしまうのです。しかし、今日Vista RC2をインストールしましたので、それで実行してみると問題なく実行することができました。たかせさんが最初に提示されたコードも問題なく実行できています。

他にも同じ症状の人はいるでしょうか?また、何かわかる方がいたら教えていただきたいです。
たかせ
記事: 215
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

状況判明しました。

#6 投稿記事 by たかせ »

たかせです。
いろいろ、調べてみたらprompt.sbpのinputというsub内で、
reallocされていないことが判明しました。
その原因でmemcpy関数で強制終了されます。

なお、逃げ道は2~3とおりあります。
一例では、
inputの直前でzerostring関数で文字列エリアを確保する。
promptのinputにあるreallocをコメントアウトする。

これで正常に動作することが確認できました。

でもこれはあくまでも暫定手段です。
たかせ
記事: 215
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

OverTakerさんへ

#7 投稿記事 by たかせ »

たかせです。
>うちのXP Home x86 SP2で#N88BASICまたは#consoleを書いただけのプログラムを実行しますと、アクセス違反が起きてしまうのです。

うちのpcはxpなので上記の現象は発生しませんでした。
ちなみにどこでアクセス違反が起きますか?

>しかし、今日Vista RC2をインストールしましたので、それで実行してみると問題なく実行することができました。たかせさんが最初に提示されたコードも問題なく実行できています。

これって不思議ですね。うん~
最後に編集したユーザー たかせ [ 2011年2月26日(土) 13:35 ], 累計 1 回
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#8 投稿記事 by OverTaker »

たかせさん、わざわざ返信ありがとうございます。
上記の#N88BASICと#promptのアクセス違反の件ですが、滅多に起こらないのか、私のXP環境でしか再現できたことはありません。また、Ver.4.0のActiveBasicで確認してみたところ、こちらもアクセス違反が起きてしまっています。
このことから、間違いなくWindowsがおかしいというわけなので、放置しています。ちなみに、_System_realloc()でアクセス違反になります。
いろいろ、調べてみたらprompt.sbpのinputというsub内で、
reallocされていないことが判明しました。
その原因でmemcpy関数で強制終了されます。
ところで、そちらのアクセス違反も気になるところではありますね。本来正しく動作するはずのものですので、realloc()されていないというのはよくわかりませんが、少なくとも、正常に動作するうちのVista環境では、そのような奇怪なことをしなくても、問題なく動作します。

他にも、このような不思議な現象に見舞われている人はいないでしょうか?



最後に、今更気がつきましたが、アクセス違反が起きていたのは、#N88BASICと#promptです。以前の投稿に誤りがありましたので一応書いておきます。
高信期

#9 投稿記事 by 高信期 »

>OverTakerさん
わたしの環境では#console以外で、メインのウィンドウを閉じるとアクセス違反になります。
どうもウィンドウプロシージャがWM_DESTROYを受ける前後でアクセス違反が起きるようです。
以前にもここで報告しましたが、環境依存っぽいのであきらめています。
たかせ
記事: 215
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

高信期さんへ

#10 投稿記事 by たかせ »

たかせです。
>OverTakerさん
わたしの環境では#console以外で、メインのウィンドウを閉じるとアクセス違反になり>ます。
>どうもウィンドウプロシージャがWM_DESTROYを受ける前後でアクセス違反が起きるようです。
>以前にもここで報告しましたが、環境依存っぽいのであきらめています。

僕のPCでも同じ現象がたまに起きます。
大半は、プログラムのミスが圧倒てきです。
たとえば、alloc/freeの指定方法が不正だったり。
string型データにおいて確保されたエリア以上の長さの文字列を設定する。

そこでもう少し詳細を教えてください。
高信期

#11 投稿記事 by 高信期 »

OverTakerさんが書いているとおり、

コード: 全て選択

#prompt
とするだけでウィンドウを閉じるとアクセス違反になります。
また、

コード: 全て選択

#prompt
Dim A As String
Input A
とすると、入力終了後INPUT_FromPrompt関数で落ちます。

現在開発している環境(Windows Xp Home)ではOSのサービスをかなり切っているのですが、
サービスをデフォルトのままにしている別のユーザーに切り替えてデバッグすると何事も無く終了できるので、
そこら辺に問題があると思うのですが…。
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#12 投稿記事 by OverTaker »

今日、さらに詳しいことがわかりました。
デバッグ実行ではアクセス違反になるのですが、リリースコンパイルをすると正しく動作するのです。環境は、XP Home x86 SP2、AB3.13/AB4.24/AB5.0 CP3いずれも同様です。
AB5.0だけでしたら、デバッガのバグだと予想できるのですが、昔正常に動作していたAB3.13やAB4.24まで正常に動作しないようなので、やはりXPや環境に、何か問題がありそうです。
高信期 さんが書きました:OverTakerさんが書いているとおり、

コード: 全て選択

#prompt
とするだけでウィンドウを閉じるとアクセス違反になります。
ちなみに、うちはウィンドウを閉じる時ではなく、起動時にアクセス違反が起きます。


追記:
高信期 さんが書きました:現在開発している環境(Windows Xp Home)ではOSのサービスをかなり切っているのですが、
サービスをデフォルトのままにしている別のユーザーに切り替えてデバッグすると何事も無く終了できるので、
そこら辺に問題があると思うのですが…。
セーフモードで起動して確認してみたところ、何も変わりませんでした。サービスはあまり関係ないようです。別のユーザーに切り替えても、特に変化はありませんでした。
返信する