|
 |
|
2015/5/9(Sat) 08:14:52|NO.69090
まずは下のURLにアクセスしてください。
http://hsp.tv/play/pforum.php?mode=all&num=69019
上のサイトの下の方を見てくれると分かる通り、
ウィンドウ数管理機能付きウィンドウ用命令を含むモジュールを作っているのですが、
ひとまずエラーは判明してるだけなら消せたのですが、
どうも致命的なバグがのこるようです。
いろいろといじってみたところ、バグの原因は特定できたのですが、
それを消す方法がわかりません。
当然、心当たりを手当たり次第に試してみましたが、
バグはなかなか消えません。
一つは消えたのですが。
これがそのプログラムです。
#module "xscreen"
//screen
#define global mkscr(%1=0,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=640,%8=480) hsp_scr_cnt@xscreen++:screen %1,%2,%3,%4,%5,%6:title "xscrren ID:"+%1
//bgscr
#define global mkbgscr(%1=0,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=640,%8=rnd480) hsp_scr_cnt@xscreen++:bgscr %1,%2,%3,%4,%5,%6:bgscr "xscrren ID:"+%1
//buffer
#define global mkbuf(%1=0,%2=640,%3=480,%4=0) hsp_scr_cnt@xscreen++:buffer %1,%2,%3,%4
//使っているウィンドウ数が代入されています。
#define global ginfo_scnt hsp_scr_cnt@xscreen
//拡張onexit定義(gosubしかできません。すいません。)
#deffunc addexit var p1
hsp_exit_label_set@xscreen(hsp_exit_label@xscreen)=p1
hsp_exit_label@xscreen++
if hsp_exit_label=0:onexit *end_label:return
return
*end_label
repeat hsp_exit_label@xscreen
gosub hsp_exit_label_set@xscreen(cnt)
loop
return
#global
hsp_exit_label=0
ldim hsp_exit_label_set@xscreen,256//ここで使えるウィンドウの最大が設定できる(なんで可変長使えないの〜)
hsp_exit_label_var=*xscreen_exit_label
addexit hsp_exit_label_var
onexit hsp_exit_label_var
goto *xscreen_script_main
*xscreen_exit_label
gsel wparam,-1
hsp_scr_cnt@xscreen--
if ginfo_scnt=0:end
return
*xscreen_script_main
バグ
・プログラムが終了できない。
誰かバグの原因を特定できる人はいませんか?
(本当に致命的なバグなので)
また、上のプログラムを実行するときには、
注意してください…。

| |
|
2015/5/9(Sat) 08:20:03|NO.69092
すみません。
デバッグ行が残ってたようです。
下から8行目のonexitの行は消してください。
addexitをコメント化していろいろ試したので。
|
|
2015/5/9(Sat) 08:28:26|NO.69094
そういえば見てわかる通り、変数に@xscreenを付けてあるのがあります。
これはモジュール空間とグローバル空間との関係を完全に理解してないので
このようにしています。
実行するときに消しても構いません。
グローバル空間のは消さないでください。
|
|
2015/5/9(Sat) 12:55:20|NO.69095
>ウィンドウ数管理機能付きウィンドウ用命令を含むモジュール
個人的にはコードの前に仕様書(こういう命令ですよというメモでもいい)が欲しいな
元の質問じゃ「1枚づつ閉じられるウィンドウが欲しい」だったのに
色々拡張してるせいで分かりにくい面がある。と言うか、終了しないのはたぶん、
mkbgscrとかmkbufとか使ったせいでhsp_scr_cnt@xscreenが0にならないからじゃないかな?
(screenのと違ってこれらは閉じるボタンで閉じられない)
>モジュール空間とグローバル空間との関係を完全に理解してない
まあHSPの名前空間の仕様はハッキリ言ってクソだからな……分かりにくいのはしゃーない
とりま、上記を踏まえてもっとシンプルに書いたらこうなった。参考までに
/* 1枚づつ閉じられるウィンドウを作成するモジュール */
/* 仕様(簡易):
* mkscrはscreen命令の代替。
* getscrcntでウィンドウ数を取得する。
*/
/* -- ここから -- */
#module "xscreen"
#define global mkscr(%1=0,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=640,%8=480) screen %1,%2,%3,%4,%5,%6,%7,%8 :hsp_scr_cnt@xscreen++
#defcfunc getscrcnt
return hsp_scr_cnt@xscreen
#global
onexit gosub *xscreen_exit
goto *main
*xscreen_exit
gsel wparam, -1
hsp_scr_cnt@xscreen--
if(hsp_scr_cnt@xscreen == 0) :end
return
*main
/* -- ここまでをモジュールとする -- */
/* 以下サンプルコード */
mkscr 0, 640, 480
title "0"
mkscr 1, 640, 480
title "1"
mkscr 2, 640, 480
title "2"
hsp_scr_cnt = getscrcnt()
repeat
hsp_scr_cnt = getscrcnt()
if(hsp_scr_cnt != hsp_scr_cnt_){
dialog "スクリーン数:" + hsp_scr_cnt
hsp_scr_cnt_ = hsp_scr_cnt
}
wait 10
loop

| |
|
2015/5/9(Sat) 12:59:19|NO.69096
名無しさんに同感。
>また、上のプログラムを実行するときには、注意してください…。
何を注意すればいいのかわからない。
|
|
2015/5/9(Sat) 15:10:48|NO.69099
名無しさん、ありがとうございます。
スペースさん実行するときに気を付ける点は、
プログラムを終了できないことです。
名無しさんのおかげで、
バグも無くなったわけですが、
現状、onexitを使っているので、
onexitを使われると、ウィンドウ管理が止まるので、
それをどうするかという問題が発生します。
そこで、マクロで対応しようとしたら、
なぜかエラーが…。
/* ウィンドウ数管理機能付きウィンドウ用モジュール */
/* 仕様(簡易):
* mkscrはscreen命令の代替。
* mkbgscrはbgscr命令の代替。
* getscrcntでウィンドウ数を取得する。
* 注意
* scrrenとbgscrを使ってもウィンドウは一枚ずつ閉じれません。
* 必ずmkscrとmkbgscrを使ってください。
*/
/* -- ここから -- */
#module "xscreen"
#define global mkscr(%1=0,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=640,%8=480) screen %1,%2,%3,%4,%5,%6,%7,%8 :hsp_scr_cnt@xscreen++
#define global mkbgscr(%1=0,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=640,%8=480 ) bgscr %1,%2,%3,%4,%5,%6,%7,%8 :hsp_scr_cnt@xscreen++
#undef onexit
#define global onexit(%1="goto",%2) hsp_jump_mode=%1:hsp_exit_label=%2:oncmd 2,*xscreen_exit
#defcfunc getscrcnt
return hsp_scr_cnt@xscreen
#global
onexit "gosub",*hsp_default_label
goto *main_label
*hsp_default_label
return
*xscreen_exit
gsel wparam, -1
hsp_scr_cnt@xscreen--
if(hsp_jump_mode="goto"):goto hsp_jump_mode
if(hsp_jump_mode="gosub"):gosub hsp_jump_mode
if(hsp_scr_cnt@xscreen == 0) :end
return
*main_label
/* -- ここまでをモジュールとする -- */
/* 以下サンプルコード */
mkscr
発生するエラーは、
#error 16 in line 20
-->パラメータが多すぎます。
です。
#defineの定義を見る限り、
パラメータの数は問題ないようですが。
どこが原因だかわかりますか?

| |
|
2015/5/9(Sat) 16:08:55|NO.69103
in line 20 ですよ。onexit "gosub"のことです。
たしかoncmd2というサブルーチンの多重登録可能なモジュールがあったので、
それでWM_CLOSEを捕まえて処理すれば制約抜きで実装できると思います。
|
|
2015/8/16(Sun) 10:59:28|NO.70798
onexit命令を使わず、#deffuncのonexit指定で行く方針で行きたいと思います。
複数ラベルを登録できるonexitはそのうち作りたいと思います。
|
|