参考:HSP3のFAQ:エラーメッセージの意味と対処法が分からない
エラーメッセージの意味と対処法を大まかに書いておきますので、自分の環境と照らし合わせてみてください。
エラーメッセージの一覧とその原因と対処
1 "解釈できないHSPコードです"
コンパイルされたHSPの中間コードが間違っています。
通常は表示されないエラーです。ファイルが破損している場合や、
予期しない事態が起こった時に表示されます。
- 原因
- 対処
2 "文法が間違っています"
関数と命令の記述方法が間違っている時や、変数名、ラベル名が間違っている時に表示されます。
- 原因
文法が間違っている。もしくは拡張マクロの設定が意図しないものになっていたりなど。
- 対処
プログラムガイドを読み、hsp2での文法でスクリプトを書いているかなど、開発環境の設定も確認すること。
3 "パラメータの数値が異常です"
パラメータの数値が許容範囲を越えている場合に表示されます。
- 原因
命令のパラメータには特定の値を指定するものもあるがそれを無視していたり、大きすぎる値(32bit以上など)や負数を指定していたりなど。
プログラムの中で変数の値が書き換わった時のことを考えていなかったり。
- 対処
命令リファレンスをよく読み、パラメータを指定すること。
また変数を使う時は常にプログラム中で変数のとりうる値を把握し、「想定しない値になったときはどうするのか」ということもスクリプトに書く。
4 "計算式でエラーが発生しました"
計算式の書き方が間違っていたり、使用できない記号や演算をしようとした時に表示されます。
- 原因
- 対処
5 "パラメータの省略はできません"
パラメータの省略ができない部分が省略されている時に表示されます。
- 原因
- 対処
パラメータを省略せずに記述する。
6 "パラメータの型が違います"
パラメータに指定された型(文字列型、数値型など)が、規定のものではない時に表示されます。
変数が指定されている場合は、変数の型が間違っています。
- 原因
- 対処
debugウィンドウを利用して変数の型が誤っていないか調べる。
7 "配列の要素が大きすぎます"
配列の要素として指定した値が、dim、sdim命令などで設定した数を越えている時に表示されます。
- 原因
- 対処
- 例
dim tmp, 10
mes tmp.10
8 "有効なラベルが指定されていません"
ラベルとして指定すべきパラメータが間違っている場合や、ラベルを示す「*」の後に何もない時に表示されます。
- 原因
- 対処
9 "サブルーチンのネストが深すぎます"
gosub命令、repeat命令を多重に実行しすぎた時に表示されます。
- 原因
1 文字通り、サブルーチンのネストが深すぎる(再起呼び出し等)
2 サブルーチンからメインルーチンにgotoしている
3 サブルーチンから、(直接または間接に)自分を呼び出しているサブルーチンへgotoしたりgosubしている(再起呼び出しを除く)
4 文字通り、repeat〜loopのネストが深すぎる(再起呼び出し等)
5 repeat〜loopからgotoなどbreak以外で飛び出している
6 if 〜:loopなどでloopを経ずにループから飛び出している
- 対処
1 再起呼び出しはループに変換できるので、ループに変換する
2 サブルーチンからはreturnで戻る
3 論理的におかしいので、混乱していると思われる。きちんとロジックを考え直す。
4 再起呼び出しでないとすると、……
5 フラグを立ててbreakでループを抜け、フラグを見てgotoする
6 loopはif〜の中に入れない
- 例1
誤ったスクリプト
*l_1
gosub *l_sub
stop
*l_sub
goto *l_1
修正したスクリプト
*l_1
gosub *l_sub
stop
*l_sub
return
- 例2
誤ったスクリプト
*l_1
repeat 10
if cnt<1: goto *l_1
loop
end
修正したスクリプト(ただし、無限ループします)
*l_1
repeat 10: wait 1
if cnt<1: flg=1: break
loop
if flg: goto *l_1
end
- 例3
*Label_A
repeat
repcnt++: title "Label_Aループ:"+repcnt+"個目のrepeat/"+looplev+"回ネスト"
wait 50: goto *Label_B
loop
stop
*Label_B
repeat
repcnt++: title "Label_Bループ:"+repcnt+"個目のrepeat/"+looplev+"回ネスト"
wait 50: goto *Label_A
loop
stop
スクリプトの構造を見直してネスト(=>HSP用語辞典)が多く発生しないようにしましょう。
10 "サブルーチン外のreturnは無効です"
gosub命令で呼ばれていないのに、return命令が実行された時に表示されます。
- 原因
- 対処
- 例
*MainRoutin
goto *Label
stop
*Label
return ; Error #10 : goto => return は間違いだから
「gosub => return」という流れになるように使います。
11 "repeat外でのloopは無効です"
repeat命令がないのに、loop命令が実行された時に表示されます。
- 原因
- 対処
- 例
repeat 5
if cnt=1: repeat 4
mes " "+cnt
loop
mes cnt
loop
stop
12 "ファイルが見つからないか無効な名前です"
ファイル操作をする時に、指定されたファイルが見つからなかったか、またはアクセスできないファイルである時に表示されます。
- 原因
- ファイルの置き忘れ
- ファイル名やパスの書き間違い
- カレントディレクトリが誤っている(curdirを調べる)
dialog ,16等を実行するとカレントディレクトリが変わることに注意
- exeファイルに入っていない(exeファイルに入っているファイルをリストするスクリプトで調べる)
- 対処
- ちゃんと置く
- 正しく書く
- chdirで正しく設定する
- 正しくpackする
13 "画像ファイルがありません"
picload命令で読み込むための画像ファイルが見つからない時に表示されます。
- 原因
- ファイルの置き忘れ
- ファイル名やパスの書き間違い
- カレントディレクトリが誤っている(curdirを調べる)
dialog ,16等を実行するとカレントディレクトリが変わることに注意
- exeファイルに入っていない(exeファイルに入っているファイルをリストするスクリプトで調べる)
- 対処
- ちゃんと置く
- 正しく書く
- chdirで正しく設定する
- 正しくpackする
14 "外部ファイル呼び出し中のエラーです"
exec命令で外部ファイルを呼び出す際に、何らかの問題が発生した時に表示されます。
- 原因
- 対処
15 "計算式でカッコの記述が違います"
計算式で使われている括弧「(、)」の書式が正しくない、または対応がおかしい時に表示されます。
- 原因
- 対処
- 例
title ""+repcnt+"個目のrepeat/"+(repcnt-1)+"回ネスト"
HSP2では、文字列式の中で数値計算はできないので、事前に計算して変数に代入しておく
16 "パラメータの数が多すぎます"
命令に指定されたパラメータの数が多すぎる時に表示されます。
- 原因
- 対処
17 "文字列式で扱える文字数を越えました"
文字列を扱う上での許容量を越えた時に表示されます。
- 原因
代入文の右辺や命令の引数文字列が32Kバイトを超えると、このエラーが起きます。
- 対処
代入文はstrmid命令に変える
18 "代入できない変数名を指定しています"
システム変数や予約キーワードに対して代入しようとした時に表示されます。
- 原因
- 対処
- 例
cnt=1
19 "0で除算しました"
0で割り算をしようとした場合に表示されます。
- 原因
0で割ることはできないので、エラーになります。
rnd命令のp2が0の場合もこのエラーが起きます(乱数はp2で割った余りによって求められるため)。
- 対処
- 他の部分のバグによって0になるはずのないものが0になっている場合は、バグをとります。
- バグでない場合は、割る数が0の時には計算をやめます。単にやめるだけでよい場合と、代わりに別の処理をしなければならない場合があります。
20 "バッファオーバーフローが発生しました"
文字列変数のためにsdim命令や、dim命令で確保したサイズをオーバーした場合や、
変数バッファを超えてアクセスを行なおうとした場合に表示されます。
- 原因
確保した文字列や配列が足りなくなったばあいに起きます。
- 対処
- 確保容量を増やす
- 可能性のあるところに予めチェックを入れる
21 "サポートされない機能を選択しました"
gcopy命令でパレットモード時に半透明コピーを実行しようとした場合など、
機能としてサポートされない設定が行なわれている場合に表示されます。
- 原因
- 対処
- 例
title "Label_Aループ:"+repcnt+"個目のrepeat/"+repcnt-1+"回ネスト"
|