|
|
2006/7/18(Tue) 09:12:17|NO.1393
Dripです。
HSP3.1β4でプログラムを組んでいたところ、不可解な現象が発生しました。
次の仕様のプログラム
・変数の数:450個程度。
・オフスクリーンバッファの数:10個程度。
・配列自動確保の機能を意図的に使い、数値型配列変数の長さが変化する。(1次元配列)
・オフスクリーンバッファのサイズは状況により度々変化する。
のような仕様で実行させたところ、ある一定の条件下でHSP Error 1 (システムエラー)
が発生し強制終了してしまいます。強制終了の起こる場所は、決まって次のようなプログラムの
書かれた場所です。
・a=21 ;Error 1システムエラーが発生しました。
・mes "21" ;〃
・dialog ""+a ;〃
・a=a ;〃
・gsel 21;このプログラムではError 3無効なパラメータが指定されました。
;(勿論buffer 21は予め確保されています。)
・gcopy 21,0,0 ;〃
通常では上記のプログラムは絶対エラーすることはありません。
また、このエラーは決まってbufferでYサイズに大きな値(2000等)を指定した後に発生します。
このエラーが発生する前に、時々配列変数の内容の一部が0に書き換わってしまうことがありました。
まるでbufferによって確保されたメモリ空間がオーバーフローして他の変数の内容を破壊してしまった
ような雰囲気です。問題の解決方法が一向に見出せずとても困っています。
もしも同じような状況に陥ったことがある方や、何かこの問題に関係する情報をお持ちの方が
いらっしゃいましたら、是非ご意見をお聞かせいただきたいと思います。
よろしくお願いします。
|
|
2006/7/18(Tue) 09:53:23|NO.1394
原因究明に協力したいのですが、プログラムの構成がよく分かりません。
もう少し発生条件を絞れませんか?
とりあえず、WinXP SP2 + hsp3.1b4 環境下では
条件は満たしたつもりの再現しなかったスクリプトをブリケスにアップしたので、確認お願いします。
=> http://briefcase.yahoo.co.jp/kz3hpi( temp->DripError.txt )
>問題の解決方法が一向に見出せずとても困っています。
問題が起きるスクリプトを頂ければ一番いいのですが...
コンテストに出すので見せられない、とかだと解決は難しいです。
|
|
2006/7/18(Tue) 09:54:28|NO.1395
追加情報です。エラー発生の原因と思われる個所の一部が究明されました。
しかしこれは問題の決定的な解決方法ではありません。
また、不具合の再現プログラムを組むには至っておりません。
次のプログラムを冒頭に記述したところエラーは消えました。
ddim a,32000
ddim b,32000
dim c,32000
dim d,32000
これらの変数はすべて意図的に配列自動確保を行っている変数です。
この変数のサイズを予め確保することで、とりあえずエラーは発生しなくなりましたが、
今後プログラムが増えていくに従ってどのような振舞いを見せるかは不明です。
この問題についてまだ検証を続けますので、何かこの問題に関わる情報がありましたら
些細なことでも是非お寄せいただきたく思います。
|
|
2006/7/18(Tue) 10:30:53|NO.1398
kz3 さん、ご協力ありがとうございます。
再現性の検証スクリプトも試させていただきました。
しかし先ほど発見された内容を含め検証を行いましたが、残念ながら問題の再現には
至っておりません。今後も検証を続けますが、何かわかったことがありましたら
お知らせいただければ幸いです。
※エラーが発生する問題のスクリプトそのものを提示できない理由は、
あまりにソースが巨大なことと、Windowsに標準で内蔵されていない非HSP仕様の
有料の拡張プラグインを使用していることです。
その他にもたくさんのAPIを実行しているのですが、このままではサンプルとして
提示するにはあまりに厳しいものがあるため、現在プログラムの縮小も含めてテストを
行っております。
APIが問題に関与しているかは不明です。
APIは使用しているものの、HSPの標準データアクセスでのみエラーが発生していることは確かです。
この問題は他のユーザーが作成した単純なプログラムでも発生する可能性があり、HSPの重大な不具合に
繋がる危険性もあるため、今後のHSP3の不具合修復の足がかりとなるためにも検証を続けたいと
思います。配列自動確保でエラーを確認している方や、その他この問題に関係がありそうな情報を
お持ちの方はこのスレッドにご連絡いただきたく思います。
|
|
2006/7/18(Tue) 11:05:18|NO.1399
追加情報です。
先ほどdimやddimで配列を予め確保することでエラーは発生しなくなると書きましたが、
エラーは発生しないものの、一部の配列の内容はランダムで破壊されてしまい、想定外の値に
なっているようです。
(ifによる判定で想定外の判定がくだされます。
(一度も入出力を行っていない変数の内容が1以上になっている、等)
しかしその変数を保存、表示しようとするとエラーが発生し、その直後エラーダイアログが
勝手に消えてしまうため、破壊されたときの変数の内容を確認するのは困難です。)
やはりこれもbufferのYサイズに大きな値を指定した後に発生しています。
また、エラーや不具合の発生タイミングは
・変数にアクセスした時
・スクリーンやバッファ(大きなサイズかどうかに関わらず)に何か描画しようとしたとき
のようです。
|
|
2006/7/18(Tue) 13:00:34|NO.1401
プログラム実行中に変数の内容が勝手に破壊されたり、
想定外のところで勝手にシステムエラーが発生する問題の原因が究明されました。
原因は、HSP3標準命令「gsquare」です。この命令が特定の状況下で実行されると、
変数の内容が勝手に破壊されたり、HSP3のシステムを不安定にさせ、
システムエラーを暴発させます。
問題を再現する簡潔なスクリプトを以下に示します。
//==================================================================
// gsquareが変数の内容を破壊する致命的な不具合を再現する
//==================================================================
//発生環境:Windows 2000 Pro
//ディスプレイ TrueColor(32ビット) 解像度 1280×1024
//■この不具合のポイント
// ・screenやbufferのYサイズが大きな値で初期化されたウィンドウが存在する状況下で
// gsquare命令を実行すると、変数の内容が破壊されてしまう。
// ・一度破壊されてしまうと、HSP3そのものの動作が不安定になり、
// 予期しない場所でシステムエラーが続発する。
// ・★の書かれた行を重点的にいじって実験してみてください。
// 【注意点】:この不具合は、使用しているOSやディスプレイの設定によって発生しない可能性があります。
// bufferで定義するYサイズを大きくすることで、問題を再現できる可能性があります。
// このプログラムをそのまま実行すれば、変数の内容が破壊される現象を再現できるはずです。
; オフスクリーンバッファ
buffer 3, 640, 2014 //★この2行をコメントアウトすると不具合は発生しなくなる
buffer 2,640,1300 //★1300を2000にすると実行中システムエラーを返す
; 数値型配列の自動拡張を行う
repeat 100
intary(cnt)=cnt //配列は、自分の配列番号を数値として保持
loop
tmpx=10,100,100,10
tmpy=10,10,100,100
color:gmode 0,32,32
gsquare -1,tmpx,tmpy //【最重要ポイント】★このプログラムをコメントアウトすると不具合は発生しなくなる
gsel 0
; 次のようなプログラムで発生
pos 100,100
mes "理論上のintary(50)の値= 50"
mes " 実際のintary(50)の値= "+intary(50) //私の環境ではここは640と表示されました。
stop
//==================================================================
この記事を読んでくださった皆様、
よろしければ上記のスクリプトの動作報告いただけると助かります。
どうかよろしくお願い致します。

| |
|
2006/7/18(Tue) 13:17:45|NO.1402
WindowsXP SP2 - HSP3.1b4
>buffer 3, 640, 2014 //★この2行をコメントアウトすると不具合は発生しなくなる
>buffer 2,640,2000 //★1300を2000にすると実行中システムエラーを返す
コメントアウト = ○ / 1300→2000 = X(?)... 動作に差がないような
>gsquare -1,tmpx,tmpy //【最重要ポイント】★このプログラムをコメントアウトすると不具合は発生しなくなる
コメントアウト = ○
>mes " 実際のintary(50)の値= "+intary(50) //私の環境ではここは640と表示されました。
640 = × ・・・50と表示されてます
んん?なんか微妙に動作違うのかな・・・エラー箇所がline36だけでした。
|
|
2006/7/18(Tue) 13:34:52|NO.1403
ミツエモン さん、早速の動作報告ありがとうございます。
Windows2000とXPではメモリの扱い方が違うのかもしれませんね。
WindowsXPではbufferのYサイズが大きい状態でgsquareを実行するとエラーを返した、
ということでしょうか。もしかしたらこの問題は
・Windows2000ではbufferの状況によってはHSP3のシステムが不安定に、
・WindowsXPではbufferの状態によってはHSPエラーで終了、
という差があるのでしょうか。問題を確定付けるにはもう少しデータが必要ですね。
|
|
2006/7/18(Tue) 14:28:57|NO.1405
エラーだけ再現可能な次のコードと合わせて症状を確認しました。十中八九、gsquareの不具合っぽいですね。
;OS/HSP : WinXP HE SP2 / 3.1b4
;Display: TrueColor(32ビット) 解像度1024*768
//*
screen 0, 640, 1237 ; エラー
/*/
screen 0, 640, 1236
//*/
tmpx = 10, 100, 100, 10
tmpy = 10, 10, 100, 100
gsquare -1, tmpx, tmpy
あとDripさんの簡素な再現スクリプトでも症状を確認しました。
# 「; 次のようなプログラムで発生」以降は関係なかったです。
要素の内容を確認するために即席でint型変数の全要素表示をddwに実装したので、
ssをブリケスにアップしておきます。( HPリンクから temp->gsq_error.png )
|
|
2006/7/18(Tue) 15:09:22|NO.1406
Dripです。
kz3さん、ありがとうございます。今回は本当に素早くご丁寧な返信に感謝してます。
gsq_error.png を確認させていただきました。見事に変数内の配列内容が破壊されていますね;
私と同じです。XPでも発生したとのことで、OS依存の問題ではない可能性が高まりました。
実は私の作っているプログラム中の避けては通れない部分にgsquareを使っておりまして、
ここを処理した後配列が破壊され、HSP3も不安定になり、にっちもさっちも進まない状態です;
これはもうHSP本体の修正をしてもらうしかないのでしょうか;;
|
|
2006/7/18(Tue) 15:52:19|NO.1408
> これはもうHSP本体の修正をしてもらうしかないのでしょうか;;
まずはバグトラックに報告して、
明確な不具合の原因を明らかにしてもらって、
次期以降のバージョンで不具合を修正してもらえるようお願いをして..
1.公開されているモジュールかプラグインを使用( またプラグインが増えますね^^; )
2.自分で実装( 4点変形? )
3.ドボン
というのが現状とれる対応だと思います。
|
|
2006/7/18(Tue) 16:41:07|NO.1409
Dripです。
とりあえずモジュール作って対応しました。
///////////////////////////////////////////////////////////////////////
//
// 新規命令 gsquareLE array1 , array2
//
// array1,array2に、描画したいX,Y座標の4点を代入して実行すれば、
// 現在のカラーで四角形のポリゴンを描画します。
// これはbuffer等でY軸が巨大な大きさに指定されていても問題なく実行されます。
//
///////////////////////////////////////////////////////////////////////
#module
#uselib "user32.dll"
#func ReleaseDC "ReleaseDC" int,int
#uselib "gdi32.dll"
#func SelectObject "SelectObject" int,int
#func Polygon "Polygon" int,int,int
#func DeleteObject "DeleteObject" int
#func CreatePen "CreatePen" int,int,int
#func GetStockObject "GetStockObject" int
#func CreateSolidBrush "CreateSolidBrush" int
#deffunc gsquareLE array px , array py
mref bmscr,67
col = bmscr(40) ;COLORREF (BMSCR)
CreatePen 5,0,col : pen=stat
if pen==0 : return -1
; GetStockObject NULL_BRUSH : ahBrush=stat
; if ahBrush==0 : return -1
CreateSolidBrush col : brush=stat
SelectObject hdc,pen : open=stat
SelectObject hdc,brush : obrush=stat
prm=px(0),py(0),px(1),py(1),px(2),py(2),px(3),py(3)
Polygon hdc,varptr(prm),4
SelectObject hdc,open
SelectObject hdc,obrush
DeleteObject brush
DeleteObject pen
ReleaseDC hwnd,hdc
return 0
#global
//サンプル
color 255
tmpx=50,100,50,0
tmpy=0,50,100,50
gsquareLE tmpx,tmpy
color ,,255
redraw 1 //必ずredrawで再描画してください。
gsquareとの相違点は、
・gmodeの値が反映されない
・テクスチャを張れない
・redraw 1をしないと画面に表示されない
です。しかしgsquare命令がHSP3に悪影響を与えてしまうのは問題だと思います。
早めに修正されることを祈っております。

| |
|
2006/7/24(Mon) 11:11:32|NO.1530
>早めに修正されることを祈っております。
早めに修正されたみたいですね。( 3.1b5 )
|
|