1

我正在使用 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'
4

1 回答 1

1

a() 很可能是一个 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 便利包装器,用于“声明我一个数组长度 i 类型为 'foo'”。

于 2013-03-19T22:54:42.823 回答