Edited at

HSPのint,str引数は変数ではなかった。Error23の原因と対策

More than 1 year has passed since last update.

int 引数に代入すると「Error 23 : 変数名が指定されていません。」が発生しました。

環境は HSP3.5, windows 7 personal 64bit です。

2018-08-26_105307.png

HSP の命令・関数の int, str 引数は 1 や "ABC" と同じ扱いであって、C++ などの値渡しの仮引数のように変数として扱えないことが原因です。

たとえば int _cnt という引数があっても _cnt = 0 のような代入はできません。

引数の値が 1 だとしたら、1 = 0 という処理(Error23)をしようとしたことになるようです。

この対策としては、

1. 引数の型を var 型に変える

2. 命令・関数の内部の変数にコピーして使う

などが考えられます。

対策1では、呼び出し元で変数を指定する必要がでてくるため

funcInt 1

funcStr ABC

から

i = 1    : funcInt i

s = "ABC": funcStr S

のように、手間が増えるかもしれません。

エラーの詳細については、HSP3のFAQ:エラーメッセージの意味と対処法が分からない - HSPWiKiが大変参考になりました。

次に str, int の引数で Error 23 が発生するコードを作成し確認しました。


str 引数で Error 23 が発生するコード

// --- str 引数による Error 23 ---

#module
#deffunc commaSplitErr1 str _msg
split _msg, ",", _array // error 23
logmes "commaSplitErr1 要素数 = " + stat
return
#global

#module
#deffunc commaSplit1 var _msg
split _msg, ",", _array
logmes "commaSplit1 要素数 = " + stat
return
#global

#module
#deffunc commaSplit2 str _msg
_tmpMsg = _msg
split _tmpMsg, ",", _array
logmes "commaSplit2 要素数 = " + stat
return
#global

// OK
_msg1 = "1, 2, 3, 4": commaSplit1 _msg1

// OK
commaSplit2 "1, 2, 3, 4, 5"

// Error23:
commaSplitErr1 "1, 2, 3"

結果は次のとおりで、 最後の commaSplitErr1 命令の内部で引数を split に変数として渡した 4 行目でエラーが発生していました。

commaSplit1 要素数 = 4

commaSplit2 要素数 = 5

2018-08-26_105307.png


int 引数で Error 23 が発生するコード

// --- int 引数による Error 23 ---

#module
#defcfunc plusOneErr1 int _val
_val = _val + 1 // error 23
return _val
#global

#module
#defcfunc plusOne1 var _val
_val = _val + 1
return _val
#global
#module
#defcfunc plusOne2 int _val
_tmpVal = _val
_tmpVal = _tmpVal + 1
return _tmpVal
#global

// OK
_val1 = 4: logmes "result = " + plusOne1(_val1)

// OK
logmes "result = " + plusOne2(5)

// Error23
logmes "result = " + plusOneErr1(2)

結果は次のとおりで、最後の plusOneErr1 関数の内部の _val 引数に代入する 4 行目でエラーになっていました。

result = 5

result = 6

2018-08-26_110444.png


コンパイルエラーの Error 23 は引数の書き方が間違っていると起こる

例えば local p と書くところと local, p と書いたりするとコンパイルエラー (Error 23) が発生します。

#modinit local, p

SCTmxMap.as(10) : error 23 : パラメーター引数の指定が間違っています (10行目)

--> #deffunc __init modinit sctmxtileproperties,local,p

同じように local や int などの型を書き忘れてもおこります。

#modinit p

SCTmxMap.as(10) : error 23 : パラメーター引数の指定が間違っています (10行目)

--> #deffunc __init modinit sctmxtileproperties,p


参考サイト