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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0131
naoサブルーチン内でのgotoに関して7未解決


nao

リンク

2010/1/31(Sun) 20:11:21|NO.30281

下のようなのを作って適当なキーを押しっぱなしにすると、しばらくして「スタック領域のオーバーフローです」といわれてしまいます。

onkey gosub *l c=0 stop *l goto *g return *g c++ cls mes c stop
サブルーチンを終わらせないのが悪いのですが、returnして元の場所に戻すと次の処理に移れません。
何とかしてサブルーチンを抜け出しても元の場所に戻らないようなのを作れないでしょうか?
かなり無茶なことですが、解決策があれば教えてください。



この記事に返信する


GENKI

リンク

2010/1/31(Sun) 20:56:22|NO.30282

> returnして元の場所に戻すと次の処理に移れません。

どういう状況をさすのかよくわかりません。

とりあえず、上記のようなスクリプトなら
「onkey goto」使えばいいと思います。



Chokoko

リンク

2010/1/31(Sun) 21:48:08|NO.30283

質問そのものの答えになってはいませんが、
このような処理で代用できませんか?

onkey gosub *l c=0 goto *check *l flg=1 return *g c++ cls mes c goto *check *check flg=0 repeat if flg=1:break wait 1 loop goto *g



窓口

リンク

2010/1/31(Sun) 23:30:58|NO.30284

gosub ではなく。goto を使うことが正解だと思います。

一つのラベルに goto と gosub 両方使いたいのであれば。
フラグのための変数を用意して 処理の最後で if による条件分岐が妥当だと思います。


button gosub "事件",*label button goto "実権",*label2 i=0 stop *label flg = 0 : mes "事件" goto *prc *label2 flg = 1 : mes "実権" goto *prc *prc title str(i) i++ if flg { stop }else{ return }

または、メインの処理は、gosub 固定にして こんな方法もあります。


button gosub "事件",*label button goto "実権",*label2 i=0 stop *label mes "事件" gosub *prc return *label2 mes "実権" gosub *prc stop *prc title str(i) i++ return

どちらかと言えば、二番目の方法のほうが、一般的だと思います。



007

リンク

2010/2/1(Mon) 07:27:55|NO.30293


*a_lp redraw 0 gosub *a_test wait 1 redraw 1 goto *a_lp *a_test stick key goto *b_lp return *b_lp redraw 0 gosub *b_test wait 1 redraw 1 goto *b_lp *b_test aa++ title ""+aa goto *b_lp return
という方法でループさせているとエラーがでますが、こういう場合はどうしたらいいでしょうか?
a_lpで指定の変数が増えるとb_lpへ移動
b_lpでも指定の変数が増えるとa_lpへ戻る、というようなことがしたいです。



007

リンク

2010/2/1(Mon) 07:34:37|NO.30294

すみません、窓口さんのレスを参考に解決できました
>>フラグのための変数を用意して 処理の最後で if による条件分岐が妥当だと思います。


*a_lp redraw 0 gosub *a_test if c=1 : c=0 : gosub *b_lp wait 1 redraw 1 goto *a_lp *a_test stick key c=1 : return return *b_lp redraw 0 gosub *b_test if d=1 : d=0 : return wait 1 redraw 1 goto *b_lp *b_test aa++ title ""+aa d=1 : return return
こんな感じですかね?
取り敢えずうまくいったのでよかったです。
無駄なレスすみませんでした。



ANTARES

リンク

2010/2/1(Mon) 09:03:47|NO.30296


*b_lp redraw 0 gosub *b_test if d=1 : d=0 : return wait 1 redraw 1 goto *b_lp
 これ、何か嫌ですね。
1 一見してサブルーチンであることがわからない
2 *b_lpがサブルーチンラベルとgotoラベルを兼ねている点は変わらない

*b_lp repeat redraw 0 gosub *b_test if d=1 : d=0 : break wait 1 redraw 1 loop return



007

リンク

2010/2/1(Mon) 09:56:17|NO.30297

ANTARESさん
なるほど。
ありがとうございます、参考になります。



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