【问题标题】:Ruby/FFI: String not getting to *char function argumentRuby/FFI:字符串未到达 *char 函数参数
【发布时间】:2018-11-27 18:15:36
【问题描述】:

我正在尝试使用 FFI 实现 Darknet library 中的一些功能:

require 'ffi'

class Image < FFI::Struct
  layout :w, :int
  layout :h, :int
  layout :c, :int
  layout :data, :pointer
end

class Darknet
  extend FFI::Library

  ffi_lib "./libdarknet.so"

  attach_function :load_image_color, [:string, :int, :int], Image

end

image = Darknet.load_image_color("./test.jpg", 0, 0)

文件名字符串好像打不通:

Cannot load image "(null)"
STB Reason: can't fopen

这里是the functionthe declaration

我对 FFI 很陌生,但我已经成功地实现了其他功能,没有任何问题。如果有人可以给我指点(没有双关语),我一定遗漏了一些明显的东西......

【问题讨论】:

    标签: c ruby ffi ruby-ffi


    【解决方案1】:

    Ruby 字符串与 C char *(或 char [])不同,后者是一个以空字符结尾(最后一个字符是 ASCII 0 - '\0')的连续字符数组,通常被认为是 "字符串”在c中。

    因此,您需要通过宏StringValueCStr(str)(其中str 是字符串变量"./test.jpg")将ruby 字符串转换为指针。还有StringValuePtr(str)的选项,它在性能方面更好,但是它并不完全安全,因为它没有考虑到c字符串以null结尾的事实,并且因此字符串中不能有空终止符(Ruby 字符串允许)。另一方面,StringValueCStr() 确实考虑到了这一点,因此可以确保您拥有一个有效的 c 字符串。

    【讨论】:

    • 您的答案似乎适用于纯 C Ruby 扩展,但我只是想用 FFI 制作一个库包装器......无论如何,谢谢!
    • @Etienne 啊,我应该从你的问题中提取出来。只是为了确定,你看过the FFI examples吗?
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多