X作成講座 on FB[03] (2)ソースを書く
実際に XCMD 本体を書いてみます。ソースはごく短く単純なので、メイン関数内に直接書いてしまいます。もしこの先、長く複雑なものを書くようになったら、ソースファイルを分けてメインから呼び出すようにした方が管理し易くなるでしょう。
さて足し算です。 HyperTalk から2つの引数を受け取って、返値としてその和を返します。
○ HyperTalk からの引数を読み出す
メインルーチンの 00033〜00037 で、渡された引数が str255$() という配列に入れられています。第1引数の値が str255$(0)、第2引数の値は str255$(1) に入っているわけです。
HyperTalk では全ての値を「文字列」として扱います。当然 HyperTalk から渡された引数も全て文字列なので、足し算をするために一旦数値に直します。文字列から数値への変換にはグルールーチンの StrToNum を使います。
: num& = FN StrToNum (xCmdPtr&, theStr$)
: 文字列を符号付きの longInt(倍精度整数)に変換して返す。
プログラムはこんな感じになります。
p1& = FN StrToNum(xCmdPtr&, str255$(0))
これで p1& に第1引数に渡された数値が入ります。
同様にして、第2引数の値を p2& に入れます。
p2& = FN StrToNum(xCmdPtr&, str255$(1))
足し算の結果は result& に入れてみましょう。
result& = p1& + p2&
○ HyperTalk に値を返す
これを XFCN の返値として HyperTalk に返します。 HyperTalk は全ての値を文字列として扱いますので、値を返す時は数値を文字列に変換しなければなりません。
数値から文字列への変換はグルールーチンの NumToStr を使います。
: FN NumToStr (xCmdPtr&, longInt&, theStr$)
: 符号付きの longInt(倍精度整数)を文字列に変換。
プログラムはこんな感じです。
FN NumToStr(xCmdPtr&, result&, resultStr$)
変換結果の文字列は第3引数の resultStr$ に入ります。
更にややこしいことに、HyperTalk の理解できるC文字列に変換しなければなりません。FBの扱う文字列にはFB文字列(パスカル文字列)とC文字列の2種類があり、変数に $ を付けて使うのはFB文字列の方です。 HyperTalk に値を返すにはこれをC文字列ハンドルに変換する必要があります。
FB文字列からC文字列ハンドルへの変換はグルールーチンの PasToZero を使います。
: cStrHandl& = FN PasToZero (xCmdPtr&, theStr$)
: FB文字列をC文字列に変換してそのハンドルを返す。
プログラムはこんな感じです。
resultHand& = FN PasToZero (xCmdPtr&, resultStr$)
そしてこのC文字列ハンドルを HyperTalk の読めるところに書き込みます。 HyperTalk はここに書かれたC文字列ハンドルを XCMD/XFCN の返値として扱います。
xCmdPtr&.returnValue& = resultHand&
以上のプログラムをひとつにまとめると、
p1& = FN StrToNum(xCmdPtr&, str255$(0)) p2& = FN StrToNum(xCmdPtr&, str255$(1)) result& = p1& + p2& FN NumToStr(xCmdPtr&, result&, resultStr$) resultHand& = FN PasToZero (xCmdPtr&, resultStr$) xCmdPtr&.returnValue& = resultHand&となります。も少し短く書くなら
p1& = FN StrToNum(xCmdPtr&, str255$(0)) p2& = FN StrToNum(xCmdPtr&, str255$(1)) FN NumToStr(xCmdPtr&, p1& +p2&, resultStr$) xCmdPtr&.returnValue& = FN PasToZero (xCmdPtr&, resultStr$)と言う感じでしょうか。 これをメインルーチンの 00048 の部分に書き込んで下さい。