Techioz Blog

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 * に通常使用されるもの) は正しいはずです。