Ruby FFIでのchar配列の宣言
概要
次の C コードがあります。
typedef void (*mycallback) (char buf[128]);
void take_callback(mycallback cb)
{
}
以下のように、同等の Ruby FFI 宣言を作成しました (FFI wiki の構造体に関するアドバイスに従って)。
callback :mycallback, [[:char, 128]], :void
attach_function :take_callback, [:mycallback], :void
実行すると、次のエラーが表示されます。
`find_type': unable to resolve type '[:char, 128]' (TypeError)
コールバックで char 配列を正しく宣言していないようです。 C の関数の引数で配列が機能する方法から、 [:char, 128] の代わりに :pointer を使用する必要があると思います。しかし、FFI の特殊性についてはよくわかりません。ここで実際に正しい構文は何でしょうか?
解決策
C では配列は値によって渡されません。配列は最初の要素へのポインタとして渡されるため、:pointer (または char * に通常使用されるもの) は正しいはずです。