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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0108
cofイベント時のgosubの動作がよくわかりません4解決


cof

リンク

2010/1/8(Fri) 23:17:25|NO.29838

お世話になってます。
サブルーチンジャンプでよく分からなくなってしまいましたので質問いたします。

以下のようなコードを書きましたが、うちのgosubがいつまで経っても帰って来ないようです。
私としては早く明るい「ただいま」の声を聞きたいのですが…

一体どうして「ただいま」と表示されないのか、教えて下さい。


//-------------------------- flg = 0 button gosub "gosubの帰り", *外出先 if flg { mes "ただいま" } else { mes "出かけるよ" } stop mes "一体どこいったのかしら?" end *外出先 mes "今外だよ": flg = 1 return

何かもの凄い勘違いを私はしているのでしょうか?
よろしくお願いします。



この記事に返信する


ext

リンク

2010/1/9(Sat) 00:30:48|NO.29839

gosub命令は指定したラベルの処理に移動して、
return命令を受けたときに、別に処理が元の位置に戻るだけです。
今回の場合あなたは、button命令の次の行に処理が移動すると、
誤解しているようですが、ユーザーがボタンが押すのはstop命令の位置なので、
stop状態でreturnを受けてもstopに戻り、処理が一時停止するだけです。
なので今回の場合、gosubではなくgoto命令が適しています。

どうしてもgosubを使いたいのなら、
repeat~loopで処理をループさせて、判定を行う必要があります。



GAM

リンク

2010/1/9(Sat) 00:47:05|NO.29840

先にレスされてしまいましたか…
すみませんが、悔しいので、投稿します。

buttonのラベルジャンプのモードに"gosub"を指定した場合、どのタイミングでgosubが発生するか、が大切です。

HSPの仕様では、stopやwaitでプログラムが停止している時、ボタンのgosubが発生します。
cofさんのソースでは、stopの途中(?)にgosubが発生し、*外出先 ラベルが正常に実行され、正常にreturnされます。
しかし、returnした後、再びstopによってプログラムが停止するので、
if flg { mes "ただいま" } else { mes "出かけるよ" }

の行は最初に実行された後、再び実行されることはありません。 returnの後、buttonの直後の
if flg { mes "ただいま" } else { mes "出かけるよ" }
の行に戻るわけではなく、gosubが発生した時点の
stop

の行に戻ることになるので、注意してください。



ANTARES

リンク

2010/1/9(Sat) 03:21:14|NO.29842

 button gosubは、ループ処理中にボタンが押された場合、
ボタンが押されたことによる処理を行なった後、
ループ処理の続きに戻りたいという要望から生まれたものです。



cof

リンク

2010/1/10(Sun) 00:09:00|NO.29847

ご返信ありがとうございます。

なるほど、button gosubでは
ボタンが押されたときに実行中のところから割り込まれて、
ラベルで指定されたサブルーチンに処理が移り、終了後にもとの場所に戻る
という制御になるのですね。

さらに、stop命令は無限ループのような動作をして、たとえstop中にサブリーチンから
戻ってきても以降の処理はされずstopは継続する
ということでしたか。

上記を踏まえて書き直しました。

// 1.stopせずにボタンの処理を待つように変更 flg = 0 button gosub "gosubの帰り", *外出先 mes "帰ってくるのをずっと待ってる" repeat -1 wait 10 if flg { break } loop mes "おかえり" stop *外出先 mes "今外だよ": flg = 1 return
あるいは

// 2.button gosubをbutton gotoに変更 button goto "gotoで帰る", *外出先 mes "出かけるよ" stop *@ ; ローカルラベル mes "ただいま" stop *外出先 mes "今外だよ、これから帰るよ" goto *@back ; stop処理後のラベルへジャンプする
おかげさまで、意図どおり動作するようになりました。



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