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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0320
(´ω`)gosub先でスタック破棄。1解決


(´ω`)

リンク

2012/3/20(Tue) 10:39:35|NO.45511

まあ、悪いプログラム例のひとつではあるのですが、動作として気になったので。(・ω・)


s = 0 button gosub "とれま", *gogo button goto "戻る", *modoru *@ wait 10 title str(s) s+=1 goto *@back *gogo dialog "戻るでもどれや" stop *modoru return

上記プログラムのように、例えばgosubの飛び先でユーザーの選択を待つ場合。
待機するときにstopを使うと、returnでは戻れなくなりますよね(エラーが出る)。しかし、
内部sublevは維持されています。つまり、戻れそうなんだけど戻れないような仕組みに
なっているわけです。

こういう場合は単純に、gosub使うなモジュールにしろや、って話に普通はなりますが、
ひとつ思ったのは「なぜ戻れないのかしら、あるいはスタック破棄を明示できないかしら」と。
スタックは保持されてるようだし、でも戻れないのならこれまでのスタックを破棄できれば
後で考えることが少なくなっていいよなあ、と。

こんな話、殆ど聞いたことがないのでなんかオレの考え方がおかしいようにも思います。
「○○な問題が起きるだろバ───カ!」など、いろいろご教示いただければ。(u´ω`)



この記事に返信する


check

リンク

2012/3/20(Tue) 13:32:21|NO.45517

ほい。

// スタート → gosub *label1 → goto *label2 → returnで戻る mes "test start" gosub *label1 mes "test end" stop *label1 mes "label1" goto *label2 stop // ここは通らない *label2 mes "label2" return
こういうプログラムが有効なことから、stopを実行するとその後returnで戻れなくなるみたいだな。
また、"戻る" のボタンをgotoではなく、gosubにすると、stopの位置に戻ってくることから、
何処でもいいから、gosubが実行されたらその位置をスタックにプッシュしてsublevを1増やし、、
returnが実行されたらスタックから位置をポップしてその場所に移動して、
sublevを1減らすという単純なつくりなんだろう。

だから、こんな変則的なプログラムも書ける。

count = 0 mes "test start" gosub *label *label mes "HSP is one of script languages." if count == 0 : count++ : return mes "test end" stop
スタック破棄を明示できないのは勝手に破棄できたら危険だからだろう。
実際にHSPのランタイムのソースを見たわけじゃないからなんともいえないけれど。



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