トピック
エミュー negitoro0018

スタックオーバーフロー

回避方法教えてください
0そうだね
プレイ済み
返信[1]
親投稿
Hanzo rzsense
FOR~NEXT、WHILE~WEND、REPEAT~UNTILなどのループから、正規の終了条件以外の理由で抜ける場合は、GOTOではなくBREAKを使いましょう。
0そうだね
プレイ済み
返信[2]
親投稿
エミュー negitoro0018
サブルーチンかDEFを使った関数で エラーが起こった場合にはどうすれば いいでしょうか?
0そうだね
プレイ済み
返信[3]
親投稿
エミュー negitoro0018
参考画像を作りました
0そうだね
プレイ済み
返信[4]
親投稿
myu314 myu314
スタックオーバーフローの回避方法は、アルゴリズムを見直してスタックをあまり使わないようにするか、 スタック部分を自分で書いて再帰を展開することじゃないですかね。 >Hanzoさん それらの命令はスタック使われて無いですよ。 プチコン3号ではGOSUBと関数のみだったような(見落としありそう) 多重ループから抜ける構文用意されてないし、ループ抜けGOTOについては読みやすさ考慮しつつ使ってOKかと思います。
0そうだね
プレイ済み
返信[5]
親投稿
otta777 otta777a
GOSUBでサブルーチンを呼び出した場合はRETURNで 戻って下さい。GOTOでメインルーチンに戻ると GOSUBで呼び出した場所をどんどんスタックに記録して Stack overflowとなります。
0そうだね
プレイ済み
返信[6]
親投稿
スタック使ってないんじゃないくて対策が講じられてるだけなきが… まあ実用上同じだけどね
0そうだね
プレイ済み
返信[7]
親投稿
otta777 otta777a
もしサブルーチンの中でメインルーチンに戻りたい場合は 下記の様な方法が考えられます。 @MAIN GOSUB @SUB IF FLAG==TRUE THEN GOTO @MAIN 処理1 GOTO @MAIN @SUB 処理2 IF メインルーチンに戻る条件 THEN FLAG=TRUE:RETURN 処理3 RETURN
0そうだね
プレイ済み
返信[8]
親投稿
myu314 myu314
エミューさんの参考画像見ましたけど、これ弄ってるうちに治っちゃってるように見えます。 多分otta777さんの書かれてるRETURN忘れが原因だったんでしょうね:)
0そうだね
プレイ済み
返信[9]
親投稿
Hanzo rzsense
>miu314さん そうなんですか?知りませんでした。 ご教示ありがとうございます。 >エミューさん 参考画像を拝見しました。 ・19行目「DIM FX,FY,SFX,SFY」は不要だと思います。 ・逆に、20行目のDEFの次の行に、「DIM FILLX,FILLY」がある方がよいかと。 ・23行目は「GFILL SFX,SFY,FILLX,FILLY・・・」では? ・配列SX[],SY[]はどこかで定義していますか?
0そうだね
プレイ済み
返信[10]
親投稿
otta777 otta777a
参考画像はStack overflowが出るプログラムでは無いよう ですがStack overflowが出ているプログラムで次のことを チェックされてはいかがですか? GOSUBでサブルーチンを呼び出している部分を書き出して そのサブルーチンの中でGOTOでメインルーチンに戻る 事が無いかチェックしてみて下さい。 サブルーチンの最後にRETURNが記述されていても 特定の条件が成立したときにGOTOでジャンプしている 場合はRETURNせずにメインルーチンに戻っている場合が 考えられます。
0そうだね
プレイ済み
返信[11]
親投稿
エミュー negitoro0018
プログラムを見直したところ、 メインループの終わりが GOTOじゃなくてGOSUBになっていました。(ただのタイプミス) 質問回答ありがとうございました
0そうだね
プレイ済み