2013-03-19 91 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