プログラミングにはエラー、バグがつきものです。 エラー、バグの対処、対策だけでなく、防止方法までをご紹介します。
MSXプログラミングにおけるエラー、バグとは
プログラムにおけるエラー、バグとは何でしょうか。
エラーはプログラムそのものが動かない(エラーコードが出力される)もの、バグはプログラムは動くものの作者の意図したも動きとならないものです。 バグはエラーと異なりバグコードが出力されないため、必ず見つけられるとは限りません。 テストプレイを重ねても通り過ぎてしまうバグもあります。
MSXプログラミングにおける頻出エラーメッセージと対応方法
MSX-BASICのエラーメッセージのうち、頻出のものについてご紹介します。
Division by zero
割り算のある計算にて、ゼロで割ってしまった場合に発生します。
IF文で割り算の割る数がゼロの場合にその計算を飛ばすことで回避可能ですが、プログラムの実行速度が遅くなってしまう欠点があります。
MSX-BASICにはエラー処理の方法としてON ERROR GOTO 行番号があります。行先の行番号にてエラー処理を記載して対応が可能です。 GOTO文で飛んできているのでRETURNでは戻れないので、エラー処理ののちGOTOで戻す必要があります。
10 A=100 20 FOR I=10 TO -10 STEP-1 30 A=100/I 40 PRINT A 50 ON ERROR GOTO 80 60 NEXT I 70 END 80 PRINT"DIV BY 0":GOTO 60
上記プログラムを実行すると、100/10 すなわち10から順に10/9、10/8の解を表示していき、I=0のとき、10/0でエラーになるのでON ERRORで80行目に飛び、”DIV BY0”と表示したのち60行目に戻ります。次のIは-1ですので、100/-1、100/-2…と計算が進み、100/-10すなわち-10を表示して終了です。
File not found
ファイルをロードしたときに、指定したファイルがない場合にこのエラーがでます。
FILESリターンキーでファイルリストを表示し、目的のファイル名をよく確認してください。
ファイル名だけでなく、拡張子も正しくあることが必要です。
ファイル数が多くなるとかなりめんどくさいので、別途ローダーを準備すると便利です。
わたくしはMSX-FAN 1992年7月号に掲載のCALL MENUを愛用しています。 プログラム自体も長くなく、裏RAMに保存されているため本来のBASIC領域に影響がないことが特徴です。 掲載誌ディスク付きですのでお持ちの方はプログラムを打ち込まなくてもOK。 ちなみにスーパープロコレ4にも掲載されています。
Illegal function call
おそらく一番よくお世話になるエラーです。
ステートメントや関数の使い方が間違っているとの説明ですが、その他エラー全般といっても過言ではないくらい頻出です。
ステートメントや関数の使い方が間違っている。引数などが指定範囲を超えている。
との説明がありますが、変数と思って記載していたのが実は予約語であった場合にも起こりえます。変数であれば、ダイレクトモードで以下のように入力して確認します。
PRINT 変数名
変数に入っている値、文字列などが表示されます。 変数でなく予約語であればエラーが出ます。
Missing operand
文中に必要なパラメータを指定していないエラーです。
operand(オペランド)は被演算子のことで、5+8なら+が演算子、対する5と8が被演算子です。実際は演算子が多く記載されていることもあり、該当行を総括的に確認する必要があります。
NEXT without FOR
FOR 文のカウンターを増減させるにはNEXTで指定する必要があり、これはFOR文と対になって配置されます。
10 FOR I=0 TO 3 20 FOR J=3 TO 7 30 PRINT I,J 40 NEXT J 50 NEXT I 60 NEXT K このNEXTはFORと対になっていないためエラーとなる 70 END
FOR文を多重にした際には一つのNEXTで両方のカウンターを変更することもできるのでFORの数とNEXTの数は必ずしも一致しませんが、FOR文よりNEXTが多くなることはないはずです。
10 FOR I=0 TO 3 20 FOR J=3 TO 0 STEP -1 30 PRINT I,J 40 NEXT J,I 50 END
NEXT自体も予約語(MSX-BASIC内であらかじめ定められている単語)ですので変数等で用いることもできません。
エラーメッセージで指定された行数にあるNEXTが原因ですので処置しましょう。
Out of DATA
READ文はDATA文と組み合わせて使われ、以下の書式となっています。
10 READ 変数1,変数2,変数3,… 20 DATA 定数1,定数2,定数3,…
10 READ A,B,C,D Out of DATA in 10 とのエラー表示だが、ここにはエラーの原因はない 20 PRINT A,B,C,D 30 DATA 1,2,3 READ 4つに対してDATA 3つのためエラーとなる 40 END
このとき、READ文の変数とDATA文の定数が1対1で読みだされますが、
READ文の変数の数 > DATA文の定数の数
となったときにOut of DATAのエラーが出ます。
原因はREADとDATAの変数定数の数の不一致ですので、エラーが出た行数のREAD文の変数の数と対応するDATAの定数の数を確認しましょう。 どこのDATA文が読まれているかわからない(実際わかりにくいことが多いです)場合は、行数をつけないダイレクトコマンドでREAD文の変数の中身を確認してみましょう。
PRINT 変数 リターンキー
ここで出てきた数値(文字列)があるDATA文を読みこんでいることがわかりますので、該当のDATA文の定数を確認しましょう。
Out of memory
MSX-BASICの記載ができるメモリ領域を超えてしまった場合に起こるエラーです。
MSXが持っているメモリ(RAM)は機種によりさまざまで8KB、16KB、32KB、64KBとありますが、実際にプログラムで使用できるのは限られており、プログラム領域、変数領域、配列変数領域、文字列領域などで使用されない部分(フリーエリア)がなくなった場合にこのエラーが出ます。
FRE 0リターンキー
とした場合に数値がでればフリーメモリが残っていますが、0であればプログラムのどこかを削るなどでメモリの空き容量を増やさなければなりません。
8KB、16KBの機種であれば拡張RAMなどでメモリを増やすことで対処も可能ですが、32KB以上の機種では、MSX-BASICで扱える最大メモリ量を超えてしまっているため拡張RAMを追加しても無駄です。
プログラムの軽量化についてはかなり長くなるので別の機会にご紹介します。
Syntax error
プログラムの構文が誤っている際に起こります。
該当行の以下3項目は確認しましょう。
① かっこが対応していないケース
② コマンドやステートメントの綴りを誤っているケース
③ 区切りの記号(カンマ[,]やコロン[:]、セミコロン[;])
該当行以外でも、リンク先での誤りに影響を受けているケースもあります。
また、予約語がらみの可能性もあります。
FRE 0リターンキー PRINT ON ONは予約語 Syntax error PRINT ONI ONIは予約語ではないが、ONが予約語 Syntax error PRINT OF OFは予約語ではなく変数 0 Ok PRINT OFFEN OFFは予約語 Syntax error
Undefined line number
GOTO文、GOSUB文、IF文などで指定した行番号がプログラム中にないエラーです。
RENUMで行番号を変えていれば、一緒に変更されますので指定された行番号はずれません。手動で変更された際には起こりやすいです。
また、プログラム写経時に途中まで入力して実行した場合、入力行を飛ばした場合に発生するでしょう。
MSXプログラミングにおけるエラーの対処、対策方法
まずはMSXプログラミングをしていて出てしまったエラーの対処方法をご紹介します。
入力したプログラムをRUNしてしばらくするとプログラムが停止しました。 ここで出てきたメッセージが以下だとします。
●●●(エラーメッセージ)●●● in ▲▲(ラインナンバー)▲▲
ここでまず確認すべきことは、プログラムがどこまで動いたか?(進んだか?)です。
つぎにエラーメッセージを記録します。
その次にエラー解除をして、
LIST ▲▲(ラインナンバー)▲▲ リターンキー
としてエラーが起きた行のプログラムを確認します。
エラーが起きたとき【.】にその行数が記憶されているので、
LIST.リターンキー
としても同じです。
エラーの中でもIllegal function call と Syntax error が大半を占めており、このエラーの対処は多岐にわたっておりすべてを紹介はできないので、その一部をご紹介します。
TRON/TROFF
MSXプログラミングにおけるエラーの防止方法
MSXプログラミングをするにあたってエラーを置きにくくする防止方法をご紹介します。
MSXプログラミングにおけるバグの見つけ方
MSXプログラミングのバグの見つけ方についてご紹介します。
MSXプログラミングにおけるバグの対処、対策方法
MSXプログラミングをしていて出てしまったエラーの対処方法をご紹介します。
MSXプログラミングにおけるバグの防止方法
MSXプログラミングをするにあたってエラーを置きにくくする防止方法をご紹介します。