【问题标题】:Ruby ffi struct with value depending from other struct's sizeRuby ffi 结构的值取决于其他结构的大小
【发布时间】:2013-03-08 18:50:46
【问题描述】:

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

【问题讨论】:

    标签: ruby ffi


    【解决方案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' 的数组”。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多