BASIC (Beginner’s All-purpose Symbolic Instruction Code) は、初心者向けに設計されたプログラミング言語で、教育分野やホビープログラミングで広く使われてきました。シンプルな文法が特徴ですが、それでもプログラミング中にエラーに遭遇することは避けられません。このブログ記事では、BASICプログラミングでよく見かける一般的なエラーとその原因、そして具体的な解決策について詳しく解説します。エラーメッセージを理解し、適切に対処できるようになることで、プログラミングスキルを向上させましょう!💪
1. Syntax Error (構文エラー) 📝
一般的な原因:
- キーワードのスペルミス (例:
PRNT
の代わりにPRINT
) - 必要な句読点(カンマ
,
, セミコロン;
, カッコ()
など)の欠落または余分な挿入 - 演算子の使い方の誤り (例:
A = 5 +
のように演算の対象がない) - キーワードの誤用 (例: 本来不要な場所に
THEN
を使う) - 文字列リテラルを引用符
"
で囲んでいない
エラーが発生するコード例:
10 LET A = 5
20 PRNT A ' PRINTのスペルミス
30 END
10 INPUT "名前を入力してください: " N$
20 PRINT "こんにちは、 N$ ' カンマが抜けている
30 END
解決策:
エラーメッセージが表示された行番号とその周辺を注意深く確認します。
- キーワードや変数名のスペルが正しいかチェックします。
- カッコの対応が取れているか、引用符が閉じられているか確認します。
- カンマやセミコロンなどの句読点が正しく使われているか見直します。
- BASICのコマンドや関数の正しい構文をリファレンスマニュアルなどで再確認します。
修正後のコード例:
10 LET A = 5
20 PRINT A ' 正しいスペルに修正
30 END
10 INPUT "名前を入力してください: "; N$ ' セミコロンを追加(多くのBASICでは ; か ,)
20 PRINT "こんにちは、"; N$ ' PRINT文の区切りに ; や , を適切に使用
30 END
多くの場合、エラーメッセージ自体が問題のある行を示してくれるので、その行を中心に文法的な誤りがないか丁寧に確認することが重要です。
2. Type Mismatch Error (型の不一致エラー) 🔢↔️🔡
一般的な原因:
- 数値変数に文字列を代入しようとした (例:
LET A = "Hello"
※ Aが数値型の場合) - 文字列変数に数値計算の結果を直接代入しようとした (例:
LET N$ = 5 + 10
※ N$が文字列型の場合) - 数値演算が期待される関数に文字列を渡した (例:
SQR("abc")
) - 文字列操作が期待される関数に数値を渡した (例:
LEFT$(123, 1)
※ 方言によるが通常エラー) - 変数名の末尾の型宣言文字(
$
など)を付け忘れたり、間違えたりした。
エラーが発生するコード例:
10 LET X = 10
20 LET Y$ = "5"
30 LET Z = X + Y$ ' 数値(X)と文字列(Y$)を加算しようとしている
40 PRINT Z
50 END
解決策:
変数の型と、その変数に対して行っている操作が適切か確認します。
- 変数に代入する値の型が、変数の型(数値型、文字列型など)と一致しているか確認します。
- 文字列を数値として扱いたい場合は、
VAL()
関数などを使って明示的に数値に変換します。(例:VAL(Y$)
) - 数値を文字列として扱いたい場合は、
STR$()
関数などを使って明示的に文字列に変換します。(例:STR$(X)
) - 関数に渡す引数の型が、関数が期待する型と一致しているか確認します。
- 変数名の型宣言文字(
$
など)が正しく使われているか確認します。
修正後のコード例:
10 LET X = 10
20 LET Y$ = "5"
30 LET Z = X + VAL(Y$) ' Y$をVAL関数で数値に変換してから加算
40 PRINT Z
50 END
BASICの方言によっては暗黙的な型変換が行われることもありますが、基本的には型を意識し、必要に応じて明示的な変換関数を使用することがバグを防ぐ上で重要です。
3. NEXT without FOR / FOR without NEXT (ループ構造の不整合) 🔄
FOR
ループの開始 (FOR
文) と終了 (NEXT
文) が正しく対応していない場合に発生します。NEXT
文に対応する FOR
文がない、またはその逆の状況です。
一般的な原因:
FOR
文を書いたが、対応するNEXT
文を書き忘れた。NEXT
文を書いたが、対応するFOR
文を書き忘れた、またはループの外に書いてしまった。- ループが入れ子(ネスト)になっている場合に、
NEXT
文の順番が間違っている (内側のループのNEXT
が外側のループのNEXT
より後に来てしまうなど)。 NEXT
文で指定したループ制御変数が、対応するFOR
文の変数と異なる。 (例:FOR I = 1 TO 10
…NEXT J
)- 条件分岐 (
IF
文) などによって、FOR
文またはNEXT
文がスキップされてしまう場合がある。
エラーが発生するコード例 (NEXT without FOR):
10 FOR I = 1 TO 5
20 PRINT I
30 IF I = 3 THEN GOTO 50 ' ループを抜けるが NEXT に到達しない可能性がある
40 NEXT I
50 PRINT "ループ終了"
60 NEXT I ' 対応する FOR がない(既に40行目で処理されているか、GOTOで飛ばされた)
70 END
エラーが発生するコード例 (FOR without NEXT):
10 FOR I = 1 TO 5
20 PRINT I
30 ' NEXT I を書き忘れている
40 PRINT "ループ処理のはずが終わった"
50 END
エラーが発生するコード例 (ネスト順序の間違い):
10 FOR I = 1 TO 3
20 FOR J = 1 TO 2
30 PRINT I, J
40 NEXT I ' Jループの内側でIループを閉じようとしている(間違い)
50 NEXT J ' Iループの外側でJループを閉じようとしている(間違い)
60 END
解決策:
FOR
文と NEXT
文が必ずペアになっているか、コード全体を見直します。
- すべての
FOR
文に対応するNEXT
文があるか、その逆も確認します。 NEXT
文にループ制御変数 (例:NEXT I
) が指定されている場合、対応するFOR
文の変数と一致しているか確認します。- ループがネストしている場合は、内側のループが完全に外側のループの内側で完結しているか、インデント(字下げ)を活用して構造を確認します。内側の
NEXT
が先に、外側のNEXT
が後に来るようにします。 GOTO
文などでループの途中から抜けたり、NEXT
文をスキップしたりするような制御フローになっていないか確認します。もし意図的な脱出が必要な場合は、ループ構造全体を見直すか、別の制御構造(例:WHILE...WEND
やフラグ変数を用いた条件分岐)を検討します。
修正後のコード例 (ネスト順序):
10 FOR I = 1 TO 3
20 FOR J = 1 TO 2
30 PRINT I, J
40 NEXT J ' 内側のJループを先に閉じる
50 NEXT I ' 外側のIループを後に閉じる
60 END
コードのインデントを適切に行うことで、ループの対応関係が視覚的に分かりやすくなり、この種のエラーを発見しやすくなります。
4. RETURN without GOSUB (サブルーチン外のRETURN) ↪️
GOSUB
命令でサブルーチン(特定の処理をまとめた部分)にジャンプしていないのに、RETURN
命令を実行しようとした場合に発生します。RETURN
は GOSUB
でジャンプする前の場所に戻るための命令です。
一般的な原因:
- サブルーチンを定義したが、
GOSUB
命令を使わずにそのサブルーチンのコード部分にプログラムの実行が流れ込んでしまい、RETURN
に到達してしまった。 GOTO
命令でサブルーチンの中にジャンプしてしまい、RETURN
を実行しようとした。- プログラムのメインルーチン(主処理部)とサブルーチンの間に、
END
命令やSTOP
命令がなく、メインルーチンの処理が終わった後にそのままサブルーチンのコードが実行されてRETURN
に到達してしまった。
エラーが発生するコード例:
10 PRINT "メインプログラム開始"
20 GOSUB 100 ' サブルーチン呼び出し
30 PRINT "メインプログラム終了"
40 END ' ここでプログラムを終了させる必要がある
100 REM サブルーチン開始
110 PRINT "サブルーチン実行中"
120 RETURN ' GOSUBの呼び出し元に戻る
' ENDがない場合、30行目の後にそのまま100行目が実行されてしまう可能性がある
' 仮にGOSUBを使わずに100行目に到達した場合、120行目のRETURNでエラーが発生する
もし40行目の END
がないと…
10 PRINT "メインプログラム開始"
20 GOSUB 100
30 PRINT "メインプログラム終了"
' ENDがないため、処理がそのまま下に流れる
100 REM サブルーチン開始
110 PRINT "サブルーチン実行中" ' GOSUBで呼ばれた後に、再度ここが実行される
120 RETURN ' GOSUBなしでここに到達したのでエラー!
解決策:
プログラムの構造を見直し、RETURN
が必ず対応する GOSUB
の後に実行されるようにします。
- メインルーチンの終わりとサブルーチンの開始の間に、必ず
END
命令やSTOP
命令、あるいはメインルーチンから抜けるためのGOTO
命令などを記述し、メインルーチンの処理完了後にサブルーチンへ処理が流れ込まないようにします。 - サブルーチンへは必ず
GOSUB
命令を使ってジャンプするようにし、GOTO
命令でサブルーチン内にジャンプしないようにします。 - サブルーチンから抜けるときは必ず
RETURN
命令を使用します。
修正後のコード例(上記エラー例の修正):
10 PRINT "メインプログラム開始"
20 GOSUB 100 ' サブルーチン呼び出し
30 PRINT "メインプログラム終了"
40 END ' メインルーチンの終わりを明示し、サブルーチンへ流れ込まないようにする
100 REM サブルーチン開始
110 PRINT "サブルーチン実行中"
120 RETURN ' 対応するGOSUBの場所へ戻る
プログラム全体の流れを把握し、サブルーチンが意図したとおりに呼び出され、正しく元の場所に戻ることを確認することが重要です。
5. Out of DATA Error (データ不足エラー) 📄
READ
命令が実行されたときに、読み込むべきデータが DATA
文にもう残っていない場合に発生します。
一般的な原因:
READ
命令の実行回数が、DATA
文で定義されているデータの個数よりも多い。- ループ処理の中で
READ
命令を使っていて、ループの反復回数がデータ数を超えてしまった。 DATA
文に記述すべきデータの個数が不足している、または記述を忘れている。RESTORE
命令を使ってデータポインタを先頭に戻さずに、繰り返しデータを読み込もうとしている(一度読み込んだデータは再度読み込めないため)。
エラーが発生するコード例:
10 DATA "Apple", "Banana", "Cherry" ' データは3つ
20 FOR I = 1 TO 4 ' ループは4回実行しようとする
30 READ F$
40 PRINT F$
50 NEXT I
60 END
このコードでは、4回目の READ F$
が実行される時点で DATA
文にデータが残っていないため、「Out of DATA」エラーが発生します。
解決策:
READ
する回数と DATA
文のデータ数が一致しているか確認します。
DATA
文に十分な個数のデータが記述されているか確認します。READ
命令を実行する回数(特にループ内での実行回数)が、データの個数を超えないようにプログラムロジックを見直します。- もしデータを繰り返し読み込みたい場合は、
READ
ループの前にRESTORE
命令を実行して、データポインタをDATA
文の先頭に戻す必要があります。 - データの終端を示す特別な値(例: -1 や “END” など)を
DATA
文の最後に用意し、READ
した値がその終端値かどうかをチェックしてループを抜ける、という方法も有効です。
修正後のコード例 (データ終端値を使用):
10 DATA "Apple", "Banana", "Cherry", "END_OF_DATA" ' 終端マーカーを追加
20 READ F$
30 WHILE F$ <> "END_OF_DATA" ' 終端マーカーが出るまでループ
40 PRINT F$
50 READ F$ ' 次のデータを読み込む
60 WEND
70 END
修正後のコード例 (RESTOREを使用):
10 DATA 10, 20, 30
20 PRINT "1回目の読み込み:"
30 FOR I = 1 TO 3: READ V: PRINT V;: NEXT I: PRINT
40 RESTORE ' データポインタを先頭に戻す
50 PRINT "2回目の読み込み:"
60 FOR I = 1 TO 3: READ V: PRINT V;: NEXT I: PRINT
70 END
DATA
文と READ
命令の組み合わせは、プログラムに初期データを与える簡単な方法ですが、データ数と読み込み回数の管理には注意が必要です。
6. Illegal Function Call (不正な関数呼び出し) 📞🚫
SQR
, LOG
, LEFT$
, MID$
など)を、不正な引数(パラメータ)で呼び出そうとした場合に発生します。関数が処理できない値や、範囲外の値が渡された場合などです。
一般的な原因:
- 数値関数の引数に、定義域外の値を渡した。
- 例:
SQR(-1)
(負の数の平方根) - 例:
LOG(0)
やLOG(-1)
(0以下の数の対数)
- 例:
- 文字列操作関数の引数に、不適切な値を渡した。
- 例:
LEFT$("ABC", -1)
(負の文字数を指定) - 例:
MID$("ABC", 5, 1)
(開始位置が文字列長を超えている) - 例:
INSTR("ABC", "")
(空文字列の検索 ※方言による)
- 例:
- 配列操作関数などで、不正なインデックスを指定した(
Subscript out of range
とは別に発生する場合がある)。 - 特定の関数で、引数の数が間違っている(通常は Syntax Error になることが多い)。
エラーが発生するコード例:
10 INPUT "数値を入力してください: ", N
20 IF N < 0 THEN PRINT "負の数の平方根は計算できません" ELSE PRINT SQR(N) ' Nが負の場合 SQR(-N) でエラー
30 END
10 A$ = "Hello"
20 B$ = MID$(A$, 6, 1) ' 開始位置(6)が文字列長(5)を超えている
30 PRINT B$
40 END
解決策:
関数を呼び出す前に、引数として渡す値が関数の要求する仕様(定義域、範囲、型など)を満たしているかを確認します。
- 数値関数の場合は、引数が定義域内にあることを確認します。例えば、
SQR
に渡す前に値が0以上か、LOG
に渡す前に値が正かなどをIF
文でチェックします。 - 文字列操作関数の場合は、開始位置や文字数が文字列の長さに対して妥当かを確認します。
LEN()
関数で文字列長を取得して比較すると良いでしょう。 - 使用しているBASICの方言(バージョン)のドキュメントを確認し、各関数の引数に関する制約事項を理解しておきます。
- ユーザー入力値を引数として使う場合は、特に注意深くバリデーション(妥当性チェック)を行います。
修正後のコード例:
10 INPUT "数値を入力してください: ", N
20 IF N < 0 THEN
30 PRINT "エラー: 0以上の数値を入力してください。"
40 ELSE
50 PRINT "平方根は "; SQR(N)
60 END IF
70 END
10 A$ = "Hello"
20 START_POS = 3
30 NUM_CHARS = 5 ' 文字列長を超える可能性のある文字数
40 IF START_POS > 0 AND START_POS <= LEN(A$) THEN
50 ' 取得可能な最大文字数を計算
60 MAX_CHARS = LEN(A$) - START_POS + 1
70 IF NUM_CHARS > MAX_CHARS THEN NUM_CHARS = MAX_CHARS
80 IF NUM_CHARS > 0 THEN
90 B$ = MID$(A$, START_POS, NUM_CHARS)
100 PRINT B$
110 ELSE
120 PRINT "取得する文字がありません。"
130 END IF
140 ELSE
150 PRINT "開始位置が不正です。"
160 END IF
170 END
関数の仕様を正しく理解し、入力値に対する事前チェックを徹底することが、このエラーを防ぐ鍵となります。
7. Subscript Out of Range (配列添え字範囲外エラー) 📈
一般的な原因:
DIM
文で宣言した配列のサイズ(要素数)を超えるインデックスを指定した。- 例:
DIM A(10)
と宣言した配列に対しPRINT A(11)
やA(0)
(多くのBASICでは0番から始まるか、1番から始まるか、オプションで設定できる)を実行した。
- 例:
- ループ変数などを配列のインデックスとして使っていて、ループの範囲が配列のサイズを超えてしまった。
- 計算結果を配列のインデックスとして使っていて、その計算結果が意図せず範囲外の値になってしまった。
DIM
文を書き忘れた、または配列のサイズを小さく宣言しすぎた。- 多次元配列の場合、いずれかの次元のインデックスが範囲外になった。
エラーが発生するコード例:
10 DIM Scores(5) ' 要素数5 (多くのBASICでは 0から5 または 1から5)
20 FOR I = 1 TO 6 ' ループが6回実行される (配列サイズを超える可能性がある)
30 Scores(I) = I * 10 ' Iが6の時にエラーが発生する可能性
40 PRINT Scores(I)
50 NEXT I
60 END
多くのBASICでは、DIM A(N)
とした場合、インデックスは 0 から N まで、または 1 から N までとなります。方言によって異なるため確認が必要です(OPTION BASE
命令で変更できる場合もあります)。上記例では、仮にインデックスが 1 から 5 までだとすると、I = 6
のときに Scores(6)
へのアクセスとなりエラーになります。仮に 0 から 5 まででも I = 6
で同様にエラーです。
解決策:
配列にアクセスする際のインデックスが、DIM
文で宣言した範囲内に収まっているかを確認します。
DIM
文で宣言した配列のサイズ(上限と下限)を再確認します。必要であれば、より大きなサイズで宣言し直します。- 配列のインデックスとして変数(特にループ変数)を使っている場合は、その変数の値が配列の範囲を超えないように、ループの条件や計算ロジックを修正します。
- 配列にアクセスする直前に、インデックスの値が妥当な範囲内にあるか
IF
文などでチェックするコードを追加することも有効な防御策です。 - 使用しているBASICの配列インデックスの開始番号(0始まりか1始まりか)を確認します(
OPTION BASE
など)。
修正後のコード例:
10 DIM Scores(5) ' インデックスが1から5まで使えると仮定
20 FOR I = 1 TO 5 ' ループ回数を配列のサイズに合わせる
30 Scores(I) = I * 10
40 PRINT Scores(I)
50 NEXT I
60 END
配列のサイズと、アクセスするインデックスの範囲を常に意識することが重要です。特にループ内で配列を扱う場合は、ループ範囲と配列サイズの関係を慎重に確認しましょう。
8. Division by Zero (ゼロ除算エラー) ➗0️⃣
一般的な原因:
- 割り算の除数(割る数)として、直接 0 を指定した。(例:
C = A / 0
) - 除数として使っている変数の値が、プログラムの実行中に 0 になってしまった。
- 例:
INPUT B
でユーザーが 0 を入力し、その後C = A / B
を実行した。 - 例: 計算の途中で変数の値が意図せず 0 になり、その変数で割り算を行った。
- 例:
- 整数除算 (
\
など、方言による) でも発生する。
エラーが発生するコード例:
10 INPUT "割られる数を入力: ", A
20 INPUT "割る数を入力: ", B
30 C = A / B ' Bに0が入力されるとここでエラー
40 PRINT "結果: "; C
50 END
解決策:
割り算を実行する前に、除数(割る数)がゼロでないことを確認します。
IF
文を使って、除数となる変数や式が 0 でないかをチェックします。- もし除数が 0 であった場合は、割り算を実行せずにエラーメッセージを表示するか、あるいは別の処理(例えば結果を 0 や無限大を示す特別な値にするなど、仕様による)を行うようにします。
- ユーザー入力値を除数として使う場合は、特にこのチェックが重要です。
修正後のコード例:
10 INPUT "割られる数を入力: ", A
20 INPUT "割る数を入力: ", B
30 IF B = 0 THEN
40 PRINT "エラー: 0で割ることはできません。"
50 ELSE
60 C = A / B
70 PRINT "結果: "; C
80 END IF
90 END
単純なミスに見えますが、複雑な計算の途中やユーザー入力が絡む場合に発生しやすいエラーです。割り算を行う前には、常に除数がゼロになる可能性を考慮し、事前チェックを行う習慣をつけましょう。✅
9. Undefined Statement / Label Not Found (未定義文・ラベル未定義) 🏷️❓
GOTO
文や GOSUB
文などでジャンプ先として指定された行番号やラベルが、プログラム中に存在しない場合に発生します。
※ エラーメッセージはBASICの方言により異なります。「Undefined line number」、「Label not found」、「Statement not found」などがあります。
一般的な原因:
GOTO
やGOSUB
で指定した行番号やラベルが存在しない。- 行番号やラベルのスペルミス、タイプミス。
- プログラムの変更中に、ジャンプ先の行やラベルを削除してしまったが、
GOTO
やGOSUB
の修正を忘れた。 - 行番号ベースのBASICとラベルベースのBASICを混同している。
エラーが発生するコード例 (行番号):
10 INPUT "数値を入力: ", X
20 IF X > 0 THEN GOTO 50 ' 50行が存在しない
30 PRINT "0以下です"
40 GOTO 60
' 50行目が欠落している
60 PRINT "プログラム終了"
70 END
エラーが発生するコード例 (ラベル):
INPUT "名前を入力: ", N$
IF N$ = "Admin" THEN GOTO ProcessAdmin ' ProcessAdmin ラベルが存在しない
PRINT "ようこそ、"; N$
GOTO EndProgram
' ProcessAdmin: ラベルがここに必要
PRINT "管理者処理を実行します。"
EndProgram:
PRINT "プログラムを終了します。"
END
解決策:
GOTO
や GOSUB
で指定されているジャンプ先が、プログラム内に正しく存在するかを確認します。
- 指定した行番号やラベルがプログラム内に存在するかどうかを確認します。
- 行番号やラベルのスペルが、
GOTO
/GOSUB
文での指定と完全に一致しているか確認します(大文字・小文字の区別は方言によります)。 - プログラムの構造を見直し、不要になったジャンプや、削除されたジャンプ先を参照している箇所がないか確認します。
- 行番号とラベルの両方を使用できる方言の場合は、どちらを使用しているか明確にし、一貫性を持たせます。
修正後のコード例 (行番号):
10 INPUT "数値を入力: ", X
20 IF X > 0 THEN GOTO 50 ' 50行を正しく記述
30 PRINT "0以下です"
40 GOTO 60
50 PRINT "正の数です" ' 存在する50行目
60 PRINT "プログラム終了"
70 END
修正後のコード例 (ラベル):
INPUT "名前を入力: ", N$
IF N$ = "Admin" THEN GOTO ProcessAdmin ' ProcessAdmin ラベルへジャンプ
PRINT "ようこそ、"; N$
GOTO EndProgram
ProcessAdmin: ' ラベルを正しく定義
PRINT "管理者処理を実行します。"
GOTO EndProgram ' 処理後に終了へ
EndProgram:
PRINT "プログラムを終了します。"
END
プログラムが大きくなると、行番号やラベルの管理が煩雑になりがちです。意味のあるラベル名を使ったり、構造化プログラミングの考え方(IF
/THEN
/ELSE
, WHILE
/WEND
, SELECT CASE
など、方言にあれば)を取り入れたりすることで、GOTO
の多用を避け、この種のエラーを減らすことができます。
エラー対処のヒント ✨
BASICでエラーに遭遇した場合、慌てずに以下の点を試してみてください。
- エラーメッセージを読む: エラーメッセージには、エラーの種類と発生した行番号が含まれていることが多いです。まずはメッセージをよく読み、何が問題なのかを理解しようと努めましょう。
- 問題の箇所を特定する: エラーメッセージが示す行番号やその周辺のコードを注意深く確認します。
- 簡単な例で試す: 問題が複雑なコードの一部で発生している場合、関連する部分だけを抜き出して簡単なプログラムを作成し、同じエラーが再現するか試してみます。これにより、問題の原因を絞り込みやすくなります。
- 変数の値を確認する:
PRINT
文をコードの途中に追加して、変数の値が意図したとおりに変化しているか確認します。特に、エラーが発生する直前の変数の値を確認することは、原因究明に非常に役立ちます。 - ドキュメントを参照する: 使用しているBASIC処理系のマニュアルやリファレンスを確認し、コマンドや関数の正しい構文、仕様を確認します。
- 少しずつ変更して試す: コードを修正する際は、一度に多くの変更を加えず、少し変更しては実行し、エラーが解消されたか、あるいは別のエラーが発生しないかを確認します。
エラーはプログラミング学習の一部です。エラーから学び、根気強くデバッグ(間違いを見つけて修正すること)に取り組むことで、より良いプログラマーへと成長できます。頑張ってください!😊
エラー早見表 (まとめ) 📋
よく遭遇する可能性のあるエラーとその主な原因をまとめました。
エラーの種類 | 主な原因 | 確認ポイント |
---|---|---|
Syntax Error | 文法ミス、スペルミス、記号の誤用・欠落 | キーワード、変数名、括弧、引用符、カンマなど |
Type Mismatch | 数値と文字列の混同、互換性のない操作 | 変数の型、代入する値の型、関数の引数の型、型変換関数 (VAL , STR$ ) |
NEXT without FOR / FOR without NEXT | ループ構造 (FOR /NEXT ) の不整合 |
FOR とNEXT のペア、ネスト構造、ループ制御変数 |
RETURN without GOSUB | GOSUB なしでのRETURN 実行 |
サブルーチンへのジャンプ方法 (GOSUB を使う)、メインルーチンとサブルーチンの分離 (END /STOP ) |
Out of DATA | READ 時にDATA 文のデータ不足 |
DATA 文のデータ数、READ の実行回数、RESTORE 文の必要性 |
Illegal Function Call | 関数への不正な引数 | 関数の引数の定義域・範囲 (SQR , LOG など)、文字列関数の引数 (位置、長さ)、LEN での事前チェック |
Subscript Out of Range | 配列の範囲外インデックス指定 | DIM 文での配列サイズ宣言、ループ範囲、インデックス計算、インデックスの開始番号 (0 or 1) |
Division by Zero | ゼロ (0) での割り算 | 割り算の除数が0でないかの事前チェック (IF 文) |
Undefined Statement / Label Not Found | GOTO /GOSUB 先の行番号・ラベル未定義 |
ジャンプ先の存在確認、スペルミス、プログラム構造 |