楽屋裏 - Syntax ERROR
楽 屋 裏
e-Gadget
実は今、原因不明の Syntac ERROR に悩んでいます。
CasioBasic入門10 で作ったプログラム CH2-4 を Whle 1 と WhileEnd で挟んでループにすると、WhileEnd のところで Syntax ERROR が表示されます。
具体的には、
While 1
0→E
RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey→K
K=57⇒1→E
Dsz C
LpWhile K≠57
Locate 8,2," "
0→C
Do
E≠0⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C
If E=1
Then
Locate 3,2,"FALSE START"
IfEnd
WhileEnd
プログラムCH2-4 を単に While 1 / WhileEnd で挟んだだけです。
While 1 / WhileEnd の代わりに、Do / LpWhile 1 で挟むと、LpWhile 1 から Do までキチンと戻らず、2行を読み飛ばして3行目にジャンプすることが分かっています。
いずれの場合も、解決策としては、最後の WhileEnd あるいは LpWhile 1 の直前に Goto Z:Lbl Z を追加すれば良く、エラーは無くなり正常に動作します。
面白いことに、上で赤文字で示した If 文を、以下のように書き換えると、エラーは発生せず、正常に動作ます。
E=1⇒Goto 1
Goto Z
Lbl 1
Locate 3,2,"FALSE START"
Goto Z
Lbl Z
実は、このコードを書くとエラーが発生しないことから、Goto Z:Lbl Z を入れるとエラーが無くなることが分かったのです。
このコードは、上の If 文と同じことを If を使わずに書いたコードです。
WhileループやDoループの代わりに、Lbl / Goto でループを作ると、エラーは発生しません。
具体的には、While 1 の代わりに Lbl M、WhileEnd の代わりに Goto M を書くとエラーが発生しないのです。
そこで、原因にならない部分をそぎ落としてゆくと
While 1
20→C
Do
Dsz C
LpWhile 1
WhileEnd
といったシンプルなプログラムで、Syntac ERROR が発生し、発生部位が WhileEnd と表示されます。
このシンプルなプログラムで、WhileEnd の直前に、Goto 0:Lbl 0 を書くとエラーは消えます。
While 1
20→C
Do
Dsz C
LpWhile 1
Goro 0:Lbl0
WhileEnd
どうやら、私の fx-5800P では、While ループや Do ループで エラーが発生していることがハッキリしました。
さらに、While / WhileEnd を Lbl / Goto に置き換えると、異常が発生しません。
Lbl M
20→C
Do
Dsz C
LpWhile 1
Goto M
以上から、今のところ言えるのは、While や Doループの中に While や Doループを入れる、つまり多重ループ構造にすると問題が発生するようです。
皆さんの fx-5800P でも同じことが発生するでしょうか?
私のfx-5800P特有の問題なのかどうかが分からないので、バグだと断定するのはまだ早いのですが....
ちなみに、これまで作ったプログラムを見直してみると、ループの中にループを書いたプログラムは無く、私にとっては多重ループは今回始めてのケースです。と言うのも、実行速度を早くするために、私は Lbl / Goto と Dsz を組み合わせたループや Lbl / Goto と ジャンプ命令⇒ を組み合わせたループを多用していて、While や Do の多重ループは必要に迫られた時に使うつもりでした。
取扱説明書を見ても、多重ループに関する記述が見つかっていません(´д`)
もし、皆さんのfx-5800Pでも再現するならば、仕様なのかバグなのか、カシオに聞いて確かめようと思っています。
[2014/02/23 追記]
CasioBasic入門では、ループには While や Do を使わず、Lbl / Goto を使って進める予定です。手元で完成しているプログラムでも多重ループを使わなければ異常動作は発生していません。
応援クリックをお願いします。励みになるので...