1

FFI gem を使用して C ライブラリを変換しています。

構造体の 1 つには、別の構造体のサイズに応じて 1 つのプロパティがあります。

class MipInterface < FFI::Struct
  layout(
         :state, :uchar,
         :port_handle, :pointer,
         :input_buffer, RingBuffer,
         :input_buffer_bytes, a(MipHeader.size+255+2).u8
  )
end

a(MipHeader.size+255+2).u8その部分を ruby​​ や ffi が理解できるものに変換する方法がわかりません。

エラーは次のとおりです。

NoMethodError: undefined method `a' for MipSdk::MipInterface:Class

私が変更した場合:

:input_buffer_bytes, MipHeader.size+255+2

次に、このエラーが発生しました:

TypeError: unable to resolve type '261'
4

1 に答える 1

1

おそらく a() は、u8 プロパティを持つ構造体を返す C 関数です。その u8 プロパティはおそらくタイプであり、運が良ければ修正されたものである可能性があります-名前から char * バッファによく似ており、u8 はおそらく「符号なし 8 ビット整数」を意味するため、または:uchar

そのため、261 バイトの :uchar 配列が適している可能性があります (申し訳ありませんが、そのための ffi はわかりません)* - MipHeader.size が異なるシステムまたは構成で異なるかどうかによって異なります。

あなた望むのは

class MipInterface < FFI::Struct
  layout(
         :state, :uchar,
         :port_handle, :pointer,
         :input_buffer, RingBuffer,
         :input_buffer_bytes, [:uint8, MipHeader.size+255+2]
  )
end

a(i).fooまた、「'foo' 型の配列の長さ i を宣言する」ための C コンビニエンス ラッパーもあると思います。

于 2013-03-19T22:54:42.823 に答える