Ruby ffi结构,其值取决于其他结构的大小

时间:2013-03-19 21:17:59

标签: ruby ffi

我正在使用FFI gem转换C库。

其中一个结构具有一个属性,具体取决于另一个结构的大小。

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'

1 个答案:

答案 0 :(得分:1)

很可能a()是一个C函数,它返回一个具有u8属性的结构。那u8属性可能是一个类型,如果你很幸运它可能是固定的 - 它看起来很像char *缓冲区,从名称,因为u8可能意味着“无符号8位整数”或{{1} }

所以261字节:uchar数组可能是合适的(抱歉不知道ffi)* - 取决于MipHeader.size在不同系统或配置中是否有所不同。

认为你想要的是什么

:uchar

我也猜测class MipInterface < FFI::Struct layout( :state, :uchar, :port_handle, :pointer, :input_buffer, RingBuffer, :input_buffer_bytes, [:uint8, MipHeader.size+255+2] ) end 是一个C方便包装器“声明我类型'foo'的数组长度i。”