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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0823
kenonkey使用時のgosubの正しい戻し方3解決


ken

リンク

2021/8/23(Mon) 17:10:24|NO.93661

今までonkeyをほとんどのケースでgosubで使用していました。gosubでとばしてreturnで戻す
方法です。
たまたま、gosubでとばして、stopで止めるよなスクリプトではエラーが出るもんだと考え、
f2に反応する下記のようなスクリプトを作りましたがエラーが表示されることなく何ら問題
なく動いてしまいます。
gosubは必ずしもreturnで戻す必要がないのでしょうか?

screen 0,200,100 onkey gosub *key button goto "go", *go stop *key if wparam=113 { //f2 if ginfo(2)=0 : dialog "113-0" : goto *go if ginfo(2)=1 : dialog "113-1" : gsel 1,-1:goto *go1 if ginfo(2)=2 : dialog "113-2" : gsel 2,-1:stop } return *go screen 1, 50, 50 button goto "go1", *go1 stop *go1 screen 2, 60, 60 stop



この記事に返信する


とあるプログラマ

リンク

2021/8/23(Mon) 17:51:56|NO.93663

gosubなどによるサブルーチンジャンプを行うと、returnするときの戻り先の情報を保持するサブルーチンのネストレベルが深くなります。
サブルーチンのネストレベルは、サブルーチンジャンプ(gosub)で1段深くなり、returnで1段浅くなります。

このサブルーチンのネストレベルは、システム変数の sublev で確認することができます。

しかし、サブルーチンのネストレベルは無限ではありません。
およそ500回前後が最大で、許容を超えるとエラー29「スタック領域のオーバーフローです」が発生します。

なのでサブルーチンジャンプをした場合returnをせずとも即座にエラーはでませんが、returnせずに放っておくとエラーが発生する可能性があるので原則としてサブルーチンジャンプ後はreturnをするべきです。


例えば

*main redraw 0 color 255, 255, 255 boxf color 0, 0, 0 pos 0, 0 mes "sublev: " + sublev redraw 1 await 1 gosub *main
このようにするとサブルーチンのネストレベルが許容を超えてエラーがでる様子を再現することができます。



ken

リンク

2021/9/3(Fri) 10:39:24|NO.93748

とあるプログラマさま

返事が大変遅れてしまい申し訳ありません。
大変基本的問題だったのですね。私はHSPの文法上の決まりだと思い込んでいました。
repeat〜loopでgotoで抜けるようなことが起きていおるんですね。
ありがとうございました。

最後に、お礼が遅れてしまい申し訳ありませんでした。



ken

リンク

2021/9/3(Fri) 10:40:00|NO.93749

解決しました



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