処理に問題がある場合に表示されるErrorダイアログです。
- HSPスクリプトエディタ上 → 『 Error エラー番号 in line エラー行 』
- コンパイル済み実行ファイル → 『 内部エラーが発生しました(エラー番号) 』
HSP3に付いてる「プログラミングマニュアル1・基本仕様ガイド (hspprog.htm)」の「4.HSPの基本動作概念」→「エラーメッセージ」にHSPエラーメッセージ(HSP Error)の一覧リストが掲載されてます。(HSP3.2以降はマニュアルのインデックスに「エラーメッセージ一覧(error.htm)」)
◆ 特殊な原因1
HSP3スクリプトエディタの[HSP]→[HSP拡張マクロを使用する]にチェックマークが入ってることをまずは確認してください。初期状態ではチェックが入ってますが外してしまう人がいます。チェックがないといくつかの関数でHSPエラーになります。(HSP3.2以降はこのメニュー項目は撤廃されてます)
◆ 特殊な原因2
HSP3スクリプトエディタの「デバッグウィンドウ」を表示した状態でコンパイル実行をすると、システムエラーが発生してしまう場合があります。
このページでは、エラー番号と意味以外に、大まかな対処法も書いておきますので、自分の環境と照らし合わせてみてください。
エラーメッセージの一覧とその原因と対処
1 "システムエラーが発生しました"
通常は表示されないエラーです。ファイルが破損している場合や、予期しない事態が起こった時に表示されます。
- 原因
FAQでも予期できません。
- 対処
原因により様々。
- 例
screen -1 // ID -1 は使用できない
2 "文法が間違っています"
関数と命令の記述方法が間違っている時や、変数名、ラベル名が間違っている時に表示されます。
- 原因
文法が間違っている。もしくは拡張マクロの設定が意図しないものになっていたりなど。
- 対処
プログラムガイドを読み、hsp3.0での文法でスクリプトを書いているかなど、開発環境の設定も確認すること。
- 例
mrs "hello" ;「mes」を間違って「mrs」と打った
a=- ; 数字の打ちもらし
3 "パラメータの値が異常です"
パラメータの値が許容範囲を越えている場合に表示されます。
- 原因
命令のパラメータには特定の値を指定するものもあるがそれを無視していたり、大きすぎる値(32bit以上など)や負数を指定していたりなど。
プログラムの中で変数の値が書き換わった時のことを考えていなかったり。
- 対処
命令リファレンスをよく読み、パラメータを指定すること。
また変数を使う時は常にプログラム中で変数のとりうる値を把握し、「想定しない値になったときはどうするのか」ということもスクリプトに書く。
4 "パラメーター式の記述が無効です"
計算式の書き方が間違っていたり、使用できない記号や演算をしようとした時に表示されます。
- 原因
- 対処
- 例
goto *
5 "パラメータの省略はできません"
パラメータの省略ができない部分が省略されている時に表示されます。
- 対処
パラメータを省略せずに記述する。
- 例
mes gettime()
6 "パラメータの型が違います"
パラメータに指定された型(文字列型、数値型など)が、規定のものではない時に表示されます。
変数が指定されている場合は、変数の型が間違っています。
- 原因
- 対処
型を見直す。変数の場合はdebugウィンドウやvartypeを利用して調べる。
また、変数の型を変えないようにスクリプトを組む。
- 例
x="100" : y="50" // 数字の文字列
pos x,y
7 "配列の要素が無効です"
配列の要素として指定した値が、dim、sdim命令などで設定した数を越えている時に表示されます。
- 原因
最後以外の添え字が上限を超えている。
例:dim a,3,3: a(4,1)=0
a(1,4)=0はOK(自動拡張)
:ctype マクロのスペルミスなどという事も有り得る。
- 対処
添え字が変数の場合は、その変数がどこでおかしくなっているか調べる
- 例
dim tmp, 10
mes tmp(10)
8 "有効なラベルが指定されていません"
ラベルとして指定すべきパラメータが間違っている場合や、ラベルを示す「*」の後に何もない時に表示されます。
- 原因
- 対処
- 例
goto *strt // a が足りない
*start
9 "サブルーチンやループのネストが深すぎます"
gosub命令、repeat命令を多重に実行しすぎた時に表示されます。
- 原因
- 対処
- 例
*Label_A
repeat
repcnt++: title "Label_Aループ:"+repcnt+"個目のrepeat/"+(repcnt-1)+"回ネスト"
wait 50: goto *Label_B
loop
stop
*Label_B
repeat
repcnt++: title "Label_Bループ:"+repcnt+"個目のrepeat/"+(repcnt-1)+"回ネスト"
wait 50: goto *Label_A
loop
stop
スクリプトの構造を見直してネスト(=>HSP用語辞典)が多く発生しないようにしましょう。
マニュアルでは「サブルーチンや」とありますが、これは#29の方が多い気がします。
10 "サブルーチン外のreturnは無効です"
gosub命令で呼ばれていないのに、return命令が実行された時に表示されます。
- 原因
- 対処
- 例
*MainRoutin
goto *Label
stop
*Label
return ; Error #10 : goto => return は間違いだから
「gosub => return」という流れになるように使います。
11 "repeat外でのloopは無効です"
repeat命令がないのに、loop命令が実行された時に表示されます。
- 原因
- 対処
12 "ファイルが見つからないか無効な名前です"
ファイル操作をする時に、指定されたファイルが見つからなかったか、またはアクセスできないファイルである時に表示されます。
- 原因
ファイルの読み書きを相対パスで指定している際に、カレントディレクトリに指定したファイルが存在しない時に表示されます。
- 対処
常にカレントディレクトリに意識を向けてスクリプトを書くこと。
ファイルが存在するか、exist命令であらかじめ確認する。
- 例
; マニュアルの「2.スクリプト記述の基本」→「文字列」を参照
notesel buf
noteload "common\common.txt" ; 「\」→「\\」
mes buf
13 "画像ファイルがありません"
picload命令で読み込むための画像ファイルが見つからない時に表示されます。
- 原因
ファイルの読み書きを相対パスで指定している際に、カレントディレクトリに指定したファイルが存在しない時に表示されます。
対応していない画像ファイルを指定している。(HSP2の場合はGIFファイルやPNGファイル、 HSP3の場合はPNGファイル)
- 対処
常にカレントディレクトリに意識を向けてスクリプトを書くこと。exist命令でファイルが存在しているか確認しておくこと。
- 例
;「\\」(¥¥)をすべきところを「\」(¥)と記述している
picload "sample\demo\onibtn.gif", 1
14 "外部ファイル呼び出し中のエラーです"
exec命令で外部ファイルを呼び出す際に、何らかの問題が発生した時に表示されます。
- 原因
- 対処
15 "計算式でカッコの記述が違います"
計算式で使われている括弧「(、)」の書式が正しくない、または対応がおかしい時に表示されます。
- 原因
- 対処
16 "パラメータの数が多すぎます"
命令に指定されたパラメータの数が多すぎる時に表示されます。
- 原因
パラメータが多すぎる。
if 文のブレイスがうまく対になっていない場合も表示されます。
- 対処
命令の持つパラメータの数くらいは把握しておく。
- 例
a = 5
if a == 5 {
mes "a は 5 です。"
// }
17 "文字列式で扱える文字数を越えました"
文字列を扱う上での許容量を越えた時に表示されます。
- 原因
- 対処
18 "代入できない変数名を指定しています"
システム変数や予約キーワードに対して代入しようとした時に表示されます。
- 原因
HSP 2.x 形式のソースをHSP 3 で実行したときによく発生します。
→hsp2.61互換ソースとhsp3.x準拠ソースのまとめ
- 対処
変数名をよく考えて付ける。
19 "0で除算しました"
0で割り算をしようとした場合に表示されます。
- 原因
分母が0だとコンピュータは計算できません。
- 対処
計算する前に分母の数を調べて0だったら計算しないで答えを0にしましょう。
20 "バッファオーバーフローが発生しました"
文字列変数のためにsdim命令や、dim命令で確保したサイズをオーバーした場合や、
変数バッファを超えてアクセスを行なおうとした場合に表示されます。
- 原因
- 対処
- 例
sdim buf, 120 // 120 byte 確保
memset buf, 0x00, 121 // オーバー
21 "サポートされない機能を選択しました"
gcopy命令でパレットモード時に半透明コピーを実行しようとした場合など、
機能としてサポートされない設定が行なわれている場合に表示されます。
- 原因
- 対処
- 例
buf = "12345 - 463 = "
mes ""+ buf +""+ 12345 - 463 // 文字列から 463 を引こうとしている
22 "計算式のカッコが深すぎます"
計算式が複雑すぎて評価中にスタックオーバーが起こった場合や
何らかの理由で正しく計算が行なわれなかった時に表示されます。
通常、表示されることはありません。これが表示される場合は、
システムに致命的なエラーが発生したことを示しています。
- 原因
計算式が複雑になりすぎている。
- 対処
簡潔な記述を心がける。
23 "変数名が指定されていません"
パラメーターとして変数名を指定すべき場所に間違った記述がされていると表示されます。
- 原因
変数名を指定しなければならないところに、変数名以外を指定した
- 対処
いったん変数に代入して変数を指定するようにします
- 例1
mes strmid("aaaa",0,1) ; Error #23 "変数名が指定されていません"
strmid関数の第1引数は変数名でなければなりません。
- 例2
#module
#deffunc test str text
return strmid(text,0,1) ; Error #23 "変数名が指定されていません"
#global
a = "test string"
test a
mes refstr
#deffunc の str は文字列とみなされます。str のかわりにvar を指定するか、いったんtextを変数に代入してからreturn strmid(……とします。
24 "整数以外が指定されています"
パラメーターに整数のみを指定すべき場所で他の型が検出された時に表示されます。
- 原因
- 対処
25 "配列の要素書式が間違っています"
配列要素の書き方が間違っている場合や、配列要素を書いてはいけない場所に書かれている時に表示されます。
- 原因
- 対処
- 例
sdim buf(2), 64 // ここに配列要素を書いてはいけない
26 "メモリの確保ができませんでした"
システムの物理メモリを確保できなかった時に表示されます。
これが表示される場合は、致命的なエラーとなります。
- 原因
- 対処
27 "タイプの初期化に失敗しました"
標準型及びプラグインによる拡張型の初期化に失敗した時に表示されます。
これが表示される場合は、システムに致命的なエラーがあることを示しています。
- 原因
- 対処
プラグイン作者に問合せましょう。
28 "関数に引数が設定されていません"
関数のパラメーターが正しく記述されていない場合に表示されます。
- 原因
- 対処
29 "スタック領域のオーバーフローです"
サブルーチン呼び出しや、式の評価の処理中にスタックが破壊された場合に表示されます。通常、表示されることはありません。
これが表示される場合は、システムに致命的なエラーが発生したことを示しています。
- 原因
サブルーチンのネストが多く呼び出しが連続したとき、HSPがサブルーチンの呼び出し元を覚えきれないときエラーになります。
- 対処
- スクリプトの構造を見直して「gosub => return => gosub => return」という流れになるようにしましょう。
- スタックを自己管理してHSPのエラーが出ないようにする。
- 例
*Main
gosub *Sub
stop
*Sub
subcall++: title ""+subcall+"回目のサブルーチン呼び出し"
wait 5: goto *Main
return
30 "無効な名前がパラメーターに指定されています"
パラメーターとして無効な名称が使用されている場合に表示されます。
実態のないエイリアスやローカル変数が参照された場合にも表示されることがあります。
- 原因
- 対処
- 例
; 種まきいらずの乱数発生関数rand()
#defcfunc rand int p1
if init=0{
randomize: init=1
}
return rnd(p1) ; 関数は何か値を返さなければならない
31 "異なる型を持つ配列変数に代入しました"
初期化されている型と異なる型の値を配列に代入しようとした場合に表示されます。
- 原因
- 対処
- 代入する変数名が間違っていないかどうか確認しましょう。
- スクリプトの途中で型が変わっている可能性も疑ってみましょう。
- 怪しいところはデバッグウィンドウの「ステップ実行」を活用しましょう。
- 例
dat = 1, "abc" ; #Error 31 : 数値と文字列を同じ変数(の要素)に入れようとしている
32 "関数のパラメーター記述が不正です"
関数のパラメーター書式が間違っている場合や、カッコが足りない時に表示されます。
- 原因
- 対処
- 例
mes strf("%x", )
33 "オブジェクト数が多すぎます"
ウィンドウ内に配置されるオブジェクトが設定された制限値を越えた場合に表示されます。
- 原因
HSPは一つのウィンドウに配置できるオブジェクトの数に制限を設けていて1024個で警告をだし、それ以上作成できないように実行を中断するようになっています。
- 対処
- 「3つしか作ってないハズだよ!?」という人はオブジェクト作成命令を書く位置を考えて何度も命令が実行されないようにする。
- 「ボタンが2000個必要なんだけど...」という人は...制限を外せることは外せるが外すことは好ましくないのでアプリケーションの設計をやり直したほうがいい。
- 例
; 表面上オブジェクトは増えてないように見えるが、
; 実際には上に重なってどんどん設置されている
repeat 50
pos 20, 20
chkbox "a", hoge
wait 60
loop
34 "配列・関数として使用できない型です"
配列をサポートしていない型で配列指定をした場合や、
関数でないキーワードを関数として使用しようとした時に表示されます。
- 原因
- 対処
35 "モジュール変数が指定されていません"
パラメーターにモジュール変数を指定すべき場所に間違った内容が書かれている場合に表示されます。
- 原因
#modfuncで定義した命令を使うときに第一パラメータにnewmodで作ったモジュール変数を指定していない。
- 対処
指定する。
36 "モジュール変数の指定が無効です"
パラメーターに指定されたモジュール変数が間違ったモジュールで初期化されている場合に表示されます。
通常、表示されることはありません。これが表示される場合は、
システムに致命的なエラーが発生したことを示しています。
- 原因
間違ったモジュールで初期化したモジュール変数を指定し命令を呼び出した。/モジュール変数以外を指定して命令を呼び出した。
- 対処
newmodで初期化したモジュール変数を指定します。
- 例
#module "test" n
#modinit int num
n = num
return
#modfunc add int num
n += num
return
#global
;newmod num,test,1 ; 実行するとエラーは出ない
add num, 5 ; エラー36
37 "変数型の変換に失敗しました"
変数や値の型を変換ができなかった時やサポートされていない
場合に表示されます。
- 原因
- 対処
38 "外部DLLの呼び出しに失敗しました"
外部DLLの関数呼び出しの先のアドレス取得に失敗した場合に表示されます。
外部DLLの動作環境が整っていない場合にも表示されるようです。
- 原因
外部DLLが見つからなかった時。/
実行ファイルとともに拡張プラグインが同じフォルダ(もしくはPATHの通っている場所)にない場合に表示されることもあります。
- 対処
- スクリプトエディタから実行する場合はhsp3.exeと同じフォルダに目的のDLLがあるかどうかを確認する。
- 実行ファイルを実行する場合は実行ファイルと同じフォルダに目的のDLLがあるかどうかを確認する。(配布する際は拡張プラグインも同封する)
- その他
39 "外部オブジェクトの呼び出しに失敗しました"
COMオブジェクトの呼び出し中にエラーが発生した場合に表示されます。
- 原因
ProgIDやGUID、メソッド、プロパティ名が間違っていたり戻り値の扱いが間違っていたりなど。
- 対処
使用するコンポーネントのマニュアル・リファレンスを読む。
40 "関数の戻り値が設定されていません。"
ユーザー関数として定義されているスクリプト中に、return命令で戻り値を設定していなかった場合に表示されます。
- 原因
#defcfuncでユーザー定義関数を定義したとき、関数を抜ける(呼び出し元に値を返す)ときに「return」としか書いていない。
- 対処
returnで値を返すこと。
41 "関数を命令として記述しています。"
関数として定義されているキーワードを命令の書式で記述している場合に表示されます。命令の名前を間違って書いているか、HSP2から関数化された名前を誤って使用している可能性があります。
- 原因
HSP2用のスクリプトを実行した
- 対処
関数の記述に直す。
- 例
rnd x, 5 ; エラー41が発生
;x = rnd(5) ; OK
#3 unresolved macro(s).
- 原因
スタックが空になるような記述がされていない。
- doに対応するuntilがない。またはuntilのスペルが間違っている。またはdoを変数名に使っている。
- whileに対応するwendがない。またはwendのスペルが間違っている。またはwhileを変数名に使っている。
- forに対応するnextがない。またはnextのスペルが間違っている。またはforを変数名に使っている。
- switchに対応するswendがない。またはswendのスペルが間違っている。またはswitchを変数名に使っている。
- 対処
#Error:SJIS space code error in line [行数]
- 原因
スクリプト内に全角スペースが存在する。
- 対処
"文字列"やコメントアウト以外で許されるスペースは半角/TABスペースのみ。
HSP3スクリプトエディタの設定で、ツリーの[表示]→[非文字の可視化]で「全角スペース」 をチェックしておけば未然に防げる。
#Error:symbol in use [マクロ名] in line 行数 []
- 原因
キーワードを新規マクロとして登録しようとしている。
- 対処
#undef によってあらかじめ取り消すか、
#ifndef で定義しないようにする。
- 例
;#undef mes // mes を取り消す。
;#ifndef mes // mes が定義されているなら、#endif までを無視する。
#define mes(%1="") print@hsp %1 // 既に定義されている
;#endif
|