Home -> HSP講座 -> HPI編 No.8-2

型変換関数

前回で、char型をHSPに登録することはできました。
しかし、使えませんでした。
なぜなら変数に char 型の値を代入できないからです (致命的ですね)。
というわけで、解決策を実装しましょう。

※ちなみに、memcpyなどの命令を使えば、charに書き込めます。

今回のソースコードは前回と同じです「char」リポジトリ
つまり今回は、前回無視した部分を解説する回になります。


コマンドを使うために

HSP側で使うための命令・関数・システム変数を登録するので、dllmain.cppが長くなります。
特に、今回は3種類とも使うため、長いです。

今回は、コマンド「char」を3種類すべての意味で使います。
char 命令は dim のように配列を作るために使い、
char 関数は int のような型変換関数として使い、
システム変数 char は、char型の型タイプ値を返すシステム変数とします。
基本はこれだけあれば十分ですね。


関数を書く #3

まず宣言を書きます。cmd.h は次のようになります。

まず、char_st()関数です。これは、2つの働きをして、ちょっとややこしいです。
1つめは、変数を連続でcharの一次元配列にすることです。
char v1(x), v2(y), v3(z)... という可変長引数をとり、それぞれを括弧の要素数(x, y, z ...)を持つ一次元配列にします。
2つめは、dimと同じ働きです。
1つめとの区別として、1つめの変数に括弧が無いか、括弧の中が0の場合、です。
HspFunc_dim()関数を使います。

前に使ったような気もしますが、for文の !(*exinfo->npexflg & EXFLG_1) という条件式は、「まだ引数が続くか?」を意味します。

変数 aptr の値は、変数の括弧内に書かれていた数値です。
あとは分かりますね。

続いて、型変換関数 char() の実体 char_f() です。

まず、引数を取り出し、省略されていたらエラーにします。
前回書いた HspVarChar_Cnv() を使って変換し、それを静的変数 stt_char に格納します。
返値 (*ppResult) は静的変数 stt_char へのポインタとします。
で、それの型は必ず HSPVAR_FLAG_CHAR なので、HSPVAR_FLAG_CHAR を返します。
以上。


ヘッダを書こう

ここまでで3つの char を実装したので、使ってみましょう。
ヘッダの内容はいつもと同じです。

// char - public header

#ifndef IG_CHAR_HPI_AS
#define IG_CHAR_HPI_AS

#regcmd "_hsp3hpi_init@4", "char.hpi", 1
#cmd char 0x000

// サンプル・スクリプト
#if 1

;	char c(14)		// char c[14];
	char c, 14		// dim 的用法
	
	c = char('x')		// 'x' は int 型なので、変換して代入する
	mes c			// char('1')->str("1") に自動変換
	
	c(0) = char( 72), char(101), char(108), char(108), char(111), char(44), char(32), char(119)
	c(8) = char(111), char(114), char(108), char(100), char(33)
	sdim s
	foreach c
		s += c(cnt)	// char -> str に変換してから s に連結
	loop
	mes s
	
	stop
	
#endif

#endif

おわりに

ふぅ、やっと char が使えるようになりましたね。大変だ……。
ですがまだ使いにくいですね……。
サンプルの Hello, world! も、もっと簡単に代入したいです。
……てなわけでまだまだ続くよ!
※追記 2010 6/13(Sun)
まぁそれは各自でお願いします (おい)

では、また次回。

+参照:HSP3向けプラグイン「char」β版(lzh)


by 上大

第八章1へ   第九章へ