ab.com コミュニティ
https://www.activebasic.com/forum/

INPUT命令(N88BASICモード)にてSTRING型強制終了
https://www.activebasic.com/forum/viewtopic.php?t=1606
ページ 11

作成者:  たかせ [ 2006年10月08日(日) 10:55 ]
記事の件名:  INPUT命令(N88BASICモード)にてSTRING型強制終了

たかせです。
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" 無効な識別子です
というエラーが出てコンパイルが中断します。

作成者:  たかせ [ 2006年10月08日(日) 11:03 ]
記事の件名:  追記

たかせです。
該当箇所コメントはずしてみてください。

作成者:  OverTaker [ 2006年10月08日(日) 12:22 ]
記事の件名: 

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

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

作成者:  たかせ [ 2006年10月08日(日) 13:37 ]
記事の件名: 

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

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

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

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

PCはWIN-XP,1.5Ghz,256MBです。
見当違いならごめんなさい。

作成者:  OverTaker [ 2006年10月08日(日) 15:31 ]
記事の件名: 

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

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

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

他にも同じ症状の人はいるでしょうか?また、何かわかる方がいたら教えていただきたいです。

作成者:  たかせ [ 2006年10月28日(土) 17:26 ]
記事の件名:  状況判明しました。

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

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

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

でもこれはあくまでも暫定手段です。

作成者:  たかせ [ 2006年10月28日(土) 17:47 ]
記事の件名:  OverTakerさんへ

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

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

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

これって不思議ですね。うん~

作成者:  OverTaker [ 2006年10月28日(土) 18:51 ]
記事の件名: 

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

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



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

作成者:  高信期 [ 2006年10月28日(土) 22:41 ]
記事の件名: 

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

作成者:  たかせ [ 2006年10月29日(日) 12:42 ]
記事の件名:  高信期さんへ

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

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

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

作成者:  高信期 [ 2006年10月31日(火) 00:30 ]
記事の件名: 

OverTakerさんが書いているとおり、
コード:
#prompt
とするだけでウィンドウを閉じるとアクセス違反になります。
また、
コード:
#prompt
Dim A As String
Input A
とすると、入力終了後INPUT_FromPrompt関数で落ちます。

現在開発している環境(Windows Xp Home)ではOSのサービスをかなり切っているのですが、
サービスをデフォルトのままにしている別のユーザーに切り替えてデバッグすると何事も無く終了できるので、
そこら辺に問題があると思うのですが…。

作成者:  OverTaker [ 2006年10月31日(火) 21:24 ]
記事の件名: 

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


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

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/