c - ruby /FFI : String not getting to *char function argument

标签 c ruby ffi ruby-ffi

我正在尝试使用 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 还很陌生,但我已经成功地实现了其他功能,没有任何问题。如果有人能给我指点(没有双关语),我一定错过了一些明显的东西......

最佳答案

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

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

关于c - ruby /FFI : String not getting to *char function argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50917280/

相关文章:

c - 需要一个工具来检测 C 代码中的内存泄漏

C++ 返回指针仅给出数组的第一个元素

c - 设置接受套接字的缓冲区大小

c++ - 在执行其他功能的同时播放动画(LED Matrix 和 Arduino/ESP8266)

ruby - 使用 jemalloc 调试 sidekiq worker 内存泄漏

rust - 如何在构建脚本中指定链接器标志/参数?

ruby - 如何关闭和删除 Ruby 中的文件?

ruby - 使用 net-ssh ruby​​ gem 获取 HostKeyMismatch 异常时,使用 "remember_host!"是否存在安全风险?

rust - 如何在 Rust 中存储对结构的 void* 引用?

rust - 如何将指向自身的指针传递给 C++ 以便它可以执行回调?