3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-26

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

#参考サイト

3
3
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?