前回で、char型をHSPに登録することはできました。
しかし、使えませんでした。
なぜなら変数に char 型の値を代入できないからです (致命的ですね)。
というわけで、解決策を実装しましょう。
※ちなみに、memcpyなどの命令を使えば、charに書き込めます。
今回のソースコードは前回と同じです:「char」リポジトリ
つまり今回は、前回無視した部分を解説する回になります。
HSP側で使うための命令・関数・システム変数を登録するので、dllmain.cppが長くなります。
特に、今回は3種類とも使うため、長いです。
今回は、コマンド「char」を3種類すべての意味で使います。
char 命令は dim のように配列を作るために使い、
char 関数は int のような型変換関数として使い、
システム変数 char は、char型の型タイプ値を返すシステム変数とします。
基本はこれだけあれば十分ですね。
まず宣言を書きます。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 上大