C语言 Ruby/FFI:字符串未到达 *char 函数参数



我正在尝试使用 FFI 实现暗网库中的一些函数:

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

下面是函数和声明。

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

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

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

相关内容

  • 没有找到相关文章

最新更新