我正在使用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'
答案 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。”