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

解決しました



記事削除

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

NO.93661への返信

マスコット

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

名前

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

削除用パスワード

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

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

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