HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0509
kanamaruバグの原因について7解決


kanamaru

リンク

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
バグ
・プログラムが終了できない。
誰かバグの原因を特定できる人はいませんか?
(本当に致命的なバグなので)
また、上のプログラムを実行するときには、
注意してください…。



この記事に返信する


kanamaru

リンク

2015/5/9(Sat) 08:20:03|NO.69092

すみません。
デバッグ行が残ってたようです。
下から8行目のonexitの行は消してください。
addexitをコメント化していろいろ試したので。



kanamaru

リンク

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



スペース(HSP歴3年)

リンク

2015/5/9(Sat) 12:59:19|NO.69096

名無しさんに同感。

>また、上のプログラムを実行するときには、注意してください…。
何を注意すればいいのかわからない。



kanamaru

リンク

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の定義を見る限り、
パラメータの数は問題ないようですが。
どこが原因だかわかりますか?



ht_ask

リンク

2015/5/9(Sat) 16:08:55|NO.69103

in line 20 ですよ。onexit "gosub"のことです。

たしかoncmd2というサブルーチンの多重登録可能なモジュールがあったので、
それでWM_CLOSEを捕まえて処理すれば制約抜きで実装できると思います。



kanamaru

リンク

2015/8/16(Sun) 10:59:28|NO.70798

onexit命令を使わず、#deffuncのonexit指定で行く方針で行きたいと思います。
複数ラベルを登録できるonexitはそのうち作りたいと思います。



ONION software Copyright 1997-2023(c) All rights reserved.