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



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.89847への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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