2013-03-19 65 views
1

我正在将一个C库转换为FFI gem。Ruby ffi结构的值取决于其他结构的大小

根据另一个结构体的大小,其中一个结构体具有一个属性。

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

最有可能是()是一个C函数返回一个具有u8属性的结构。这个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是为“宣告我的数组长度型‘富’的我”一些C方便包装。

+0

你是一个天生的C猜猜!非常感谢! – tommasop 2013-03-20 10:34:46