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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0328
shinonomeonkey命令でサブルーチンからgoto命令でジャンプする4解決


shinonome

リンク

2020/3/28(Sat) 18:23:44|NO.89847

onkey命令でサブルーチンから、goto命令でジャンプする際にどんどんネストが深くなって行ってしまうんですが、
returnを挟もうにもどこに挟めばいいのかわからず混乱してしまってます...

サンプルスクリプトを貼っておきます。


mes "Enterキー押してね" onkey gosub *a stop *a if ( wparam = 13 ) : { goto *b } return *b mes "押したよ" stop



この記事に返信する


しまくろねこ

リンク

2020/3/28(Sat) 19:31:16|NO.89849


mes "Enterキー押してね" onkey gosub *a stop *a if ( wparam == 13 ) { mes "押したよ" } return
か、もしくは

mes "Enterキー押してね" onkey gosub *a stop *a if ( wparam == 13 ) { gosub *b } return *b mes "押したよ" return
では駄目でしょうか?



あらや

リンク

2020/3/28(Sat) 19:31:34|NO.89850

割り込みが入るとネストがリセットされるようなので、
そのままでも良いように思えますが。
http://hsp.tv/play/pforum.php?mode=all&num=89471
詳しくはこちらの沢渡さんの説明を読んでみてください。

ネストを確実に0にするならば
全てgosubにするか、逆に全てgotoにしたら良いのではないでしょうか。




gosubバージョン(どのキー割り込みが入っても元に戻る)

mes "Enterキー押してね" onkey gosub *a stop *a if ( wparam = 13 ) : { gosub *b // gotoではなくgosubにする } return *b mes "押したよ" return // stopではなくreturnにする




gotoバージョン(どのキー割り込みが入っても戻らず止まる=ネストを使わない)

mes "Enterキー押してね" onkey goto *a // gosubではなくgotoにする stop *a if ( wparam = 13 ) : { goto *b } stop // returnではなくstopにする *b mes "押したよ" stop



shinonome

リンク

2020/3/28(Sat) 22:02:46|NO.89851

しろくまねこさん、あらやさん、ありがとうございます。

>>
mes〜(省略)
か、
mes〜(省略)
では駄目でしょうか?

上のif文に処理を記述する方法なんですが、簡単な処理ならまだ良いんですが 長く複雑になると見ていて「なんだこれ」ってなっちゃうんですよねぇ... (自分の能力が低いからだと思うんですが) >>割り込みが入るとネストがリセットされるようなので、そのままでも良いように思えますが。 割り込みがあるとネストがリセットされるって初耳です。 自分もまだまだだなぁ... とりあえずrepeat~loopを使用してる部分のgotoをgosubに、stopをreturnにして様子を見てみようと思います。 お二人ともありがとうございました!!



沢渡

リンク

2020/3/29(Sun) 11:37:12|NO.89853

私の名前が出てきたので、ちょっと補足。
ネストがリセットされる条件は、マニュアルを読んだ限りだと
「button goto」「onkey goto」「onclick goto」「oncmd goto」
「onexit goto」「onerror goto」
による割り込みなので(いずれも"goto"の部分を省略した場合も含む)、
サブルーチン内でのgotoや、gosub系の割り込みだとリセットはされません。

以下のスクリプトで改めて検証してみましたが、onexit以外については
マニュアル通りの結果になりました。
(onexitについてはこのやり方が間違ってるのかもしれませんが)


#const WM_SIZE 0x0005 #const WM_SYSCOMMAND 0x0112 #const SC_RESTORE 0xF120 dim a onkey *key onclick *cli oncmd *min,WM_SIZE onexit *exit //onexit gotoではネストはリセットされない様子? onerror *err2 objsize 120,30 button "終了",*halt //終了させるにはこのボタンで button gosub "ネスト深める",*test button "button goto テスト",*bg button gosub "エラー発生",*error button gosub "button gosub テスト",*bgs //button gosubではネストリセットされない gosub *test *test gosub *view_nest goto *test2 //サブルーチン内でgotoしてもネストはリセットされない *test2 stop *error poke a,-1,1 //エラーを発生させる return *min oncmd 0 sendmsg hwnd,WM_SYSCOMMAND,SC_RESTORE,0 oncmd 1 *err2 *key *cli *bg *exit gosub *view_nest stop *bgs gosub *view_nest return *view_nest title str(sublev) return *halt oncmd 0 onexit 0 end



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