ネストが深すぎます

エラー「ネストが深すぎます」と出るときがありますが、
ネストと言う言葉はあまり聞きなれない言葉だと思います。

簡単に言えばプログラムの構造が複雑すぎますと言う感じのエラーです。
エラー「ネストが深すぎます」の例としては

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

目次へ 前へ

Copyright © 2006 ゴードン帝国. All Rights Reserved. Template by ネットマニア