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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0106
名無三リピートループ等のネストをリセットする方法5解決


名無三

リンク

2018/1/6(Sat) 10:19:46|NO.82182

今現在、
特定のキーを押すと情報を読み込み直す(gotoキーで情報を読み込む場所へジャンプ)するプログラムを
作っているのですが、10〜20回その操作を繰り返すと「ネストが深すぎます」というエラーが出てしまいます。
実際repeat loopのネストを調べてみると、操作一回につきネストの数が増えていっているのがわかりました。
そこで、ネストをリセットしてエラーが出ないようにするか、他でエラーを回避できないかしたいのですが、
どのような方法があるでしょうか。よろしくお願いします



この記事に返信する


ZAP

リンク

2018/1/6(Sat) 10:35:48|NO.82183

一番まっとうなのは、
repeat〜loopから抜けるときにはgotoではなくて
breakを使って抜けて、抜けた後で変数等の内容を見て
指定のラベルへジャンプさせる方法。


repeat if a==1 :goto *Label loop

ではなくて


repeat if a==1 :flag=1 :break ;条件を満たしたら、フラグを立ててループから抜ける loop if flag==1 :goto *Label ;ループから抜けてから、改めて条件判定&ジャンプ



ぜーっと!

リンク

2018/1/6(Sat) 11:16:41|NO.82184

repeat内でgotoを使って外に出るのはアカンです。
で、ZAPさんの方法に加えて2つほど思い浮かんだのは、

1)goto ではなく、gosub 使って、ループ内に戻ってくる方法。
repeat
if a : gosub *hoge loop *hoge //なにかの処理 return //gosubの元の位置に戻る

2)メインループを goto にする。これならばループ内のifでもgotoが使えます。
*mainloop
if a : goto *hoge goto *mainloop *hoge //なにかの処理 goto *mainloop //戻るときもgoto

1)の方法は、deffunc などと同等。
  returnで元の位置に戻ってこれるので、ネスト掘り続けることはないでしょう。
2)は使用箇所が多くなると、見づらくなるかもしれません。



GENKI

リンク

2018/1/6(Sat) 13:03:26|NO.82190

gotoでループを抜けた後にまた同じrepeat loop内に戻るんですね。

ネストはrepeatを通過してループに入るたびにカウントアップされていきます。
ネスト回数のカウントを減らすには、repeatで指定されたループ回数が終了して正常にループを終了するか、break命令でループを抜ける必要があります。またプログラムを終了すればネストはリセットされます。
つまり、ループの抜け方と戻り方を間違えるといずれネスト回数が上限に達してしまうわけです。

回避…というか適切な対応方法のひとつに元に位置に戻るという方法があげられます。元の場所に戻ってくるのでネストは深くも浅くもなりません。

repeat await 30 goto *label *modoru loop *label i++ title ""+i goto *modoru
分かりやすいようにgotoで書いてみましたが、もっとシンプルにgosubがおすすめです。必ず元の場所に戻ってきます。(ぜーっと!さんも説明されていますね。)

repeat await 30 gosub *label loop *label i++ title ""+i return
goto命令は飛んでいった後は順に全て追いかけないと、最終的にどこに行き着くのか分からないので、安易な多用はお勧めしません。



名無三

リンク

2018/1/6(Sat) 16:24:26|NO.82195

皆さんありがとうございます、gosubを使うように変更したら改善できました!



名無三

リンク

2018/1/6(Sat) 16:24:47|NO.82196





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