エラー「ネストが深すぎます」と出るときがありますが、
ネストと言う言葉はあまり聞きなれない言葉だと思います。
簡単に言えばプログラムの構造が複雑すぎますと言う感じのエラーです。
エラー「ネストが深すぎます」の例としては
repeat loopと言う構造がありますが、repeatの中にrepeat、さらにそのrepeatの中にrepeat・・・
と続けていき、多くなると(20程度)このエラーになります。
repeat 2
repeat 2
repeat 2
…
repeat 2
repeat 2
a=1
loop
loop
…
loop
loop
loop
gosub returnも同様です。
以下はランダムな数字であるが、同じ数字が1つもないようにするプログラムですが
場合によってはエラー「ネストが深すぎます」となります。
dim test,20 ;変数の定義
repeat 20 ;ランダムで20個の数字を出したい
e=cnt ;次のrepeatでcntに別の数字が代入されるため
*rnds
rnd r,20 ;ランダムで0〜19の数字をrに代入
test.e=r
repeat e+1 ;以前に同じ数字があったか調べるrepeat文
if ((test.cnt=test.e)&(e!=cnt)){goto *rnds} ;同じ数字があったら*rndsへ戻る
loop
print "no."+e+"="+test.e ;表示する
loop
0〜19までの数字をランダムで出したいわけですが都合良くバラバラには出てくれません。
特に最後は1/20の確率ですので goto *rnds が何回も実行されます。
repeatは続けて多く実行できない(上の例)と同様に
repeat - loopの数が多く(20程度)なってもこのエラーになります。
今はloopをする前に goto *rnds で戻っているので
goto *rnds が実行されるたびにrepeat - loopの数が1づつ増えていきます。
そのため多くなるとエラー「ネストが深すぎます」となります。
対処法としてはbleakを使うと言うものがあります。
bleakはrepeat文から抜けるときに使いますがloopまで実行したと判断されるのでrepeatの連続使用にはなりません。
よって以下のようにすればエラーは起りません。
dim test,20 ;変数の定義
repeat 20 ;ランダムで20個の数字を出したい
e=cnt ;次のrepeatでcntに別の数字が代入されるため
*rnds
z=0
rnd r,20 ;ランダムで0〜19の数字をrに代入
test.e=r
repeat e+1 ;以前に同じ数字があったか調べるrepeat文
if ((test.cnt=test.e)&(e!=cnt)){z=1:break} ;同じ数字があったら*rndsへ戻る
loop
if z=1 : goto *rnds
print "no."+e+"="+test.e ;表示する
loop
目次へ 前へ
|