トピック

気になっていることがあります。

上の画像のようにすると、Stack overflowというエラーになるんですが何故ですか?そもそも、スタックって何ですか?
1そうだね
プレイ済み
返信[1]
親投稿
HMF gunsofthemy
画像を見てもらえば分かりますが、「サブルーチンの中でサブルーチンを行い、さらにそのサブルーチンの中でサブルーチンを、その中でサブルーチンを行った。そのサブルーチンの中の・・・」 と続いたために、エラーを起こしたという訳です。スタックについてはggって下さい。
6そうだね
プレイ済み
返信[2]
親投稿
では、逆に「スタックが不足した」というエラーはどのような条件でおこるものなのですか?
0そうだね
プレイ済み
返信[3]
親投稿
ish owlis1
スタックは意味合いは複数あるみたいですが「積み重ねる」って意味合いが妥当でしょうか。英語辞書 引くと出てきますので御自分でも確かめるが吉かと。 HMFさんも言われていますがオーバーフローが起きたのは「積み重ねが許容範囲を越した」から。 ご存知かもしれませんがGOTOとは違い「GOSUBはRETURNと対」で記述します。 GOSUBを実行した行は内部で保持(積み重ね)されRETURNが記述された時点で、GOSUBを実行した行に復帰し「積み重ねが減って」いきます。 件のソースではRETURNがなく「GOSUBで実行した行を積み重ねすぎ」でエラーになっています(呼び出し順はBACKTRACE命令を参考) 永久ループがしたいのであれば、GOSUBよりGOTOで実装するのが妥当でしょうか。
7そうだね
プレイ済み
返信[4]
親投稿
ish owlis1
あ 2行目が5はよくないなぁ。6の方がわかりすいですね。失敗orz 「対」という表現も語弊があるかなぁ。悩みます。 そういえば、VARとRETURN周りをキチンと理解したのは、プログラムを始めて随分と後になってからだった記憶があるので、うまく説明できて伝わるか 少々不安です(^^;
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
GOSUBはGOTOと違って「RETURNでどこに戻るか」という情報を記録しておく必要があります。これはスタックメモリ上に記録されますが、プチコン3号のではメインメモリとは別の場所に確保されています。 このスタックメモリはRETURNで戻るたびに解放されますがRETURNがない状態だとどんどん減ってきます。そして、スタックメモリが無くなってそれ以降の続行が不可能になった時点でStack overflowエラーとなるわけです。 ちなみにプチコン3号のスタックメモリはGOSUBだと16383回分確保されています。
6そうだね
プレイ済み
返信[6]
親投稿
えーと、つまりRETURNを使わないとGOSUBでそのラベルに行きっぱなしになってそれによってスタックがあふれてしまうっていうことですか?
1そうだね
プレイ済み
返信[7]
親投稿
Villit nakahara1226
その認識で合ってると思います。 「RETURNの時に帰ってこなきゃいけないからどこでGOSUBしたか覚えといてー」を16383回連続でやって『もう覚えきれませーん』ってなってる状態です。
3そうだね
プレイ済み
返信[8]
親投稿
スタックとは データ構造の一種です。 散らかっている部屋を想像すると分かりやすいですが、散らかっている部屋って最近使ったものが取り出しやすい場所にありますよね?このように最近入れたデータから取り出していくデータ構造をスタックと言います。 客に古いデータから取り出していくデータ構造をキューと言いますが、そちらは行列に例えられます。
1そうだね
プレイ済み
返信[9]
親投稿
GOSUBやDEFも、"どこから呼び出されたか"をスタックに記憶しています。そのため、RETURNやENDで戻るときは"一番最近呼び出された場所"に戻るわけです。 そのため、戻らずに呼び出し続けるとメモリに限界が来てエラーが出ます。
1そうだね
プレイ済み
返信[10]
親投稿
この画像はサブルーチンを使ったプログラムなんですが、これで合ってますか?
0そうだね
プレイ済み
返信[11]
親投稿
みなつ tksm372
サブルーチンは、メインルーチンとして直接実行されないように、ENDより下の方に書いておくといいですよ~(*´▽`*) PRINT "メインルーチンはじまり!" GOSUB @A GOSUB @A GOSUB @A GOSUB @A PRINT "メインルーチンおわり!" END @A PRINT "サブルーチンです!" RETURN みたいな感じですっ(≧∇≦)b
1そうだね
プレイ済み
返信[12]
親投稿
助かりました。有り難う御座いました。
0そうだね
プレイ済み