0

Darknet ライブラリのいくつかの関数を 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を初めて使用しますが、問題なく他の機能を実装することができました. 誰かが私にポインタを与えることができれば(しゃれた意図はありません)、私は明らかな何かを見逃しているに違いありません...

4

1 に答える 1

0

char *Ruby の文字列は C (または)と同じではありませんchar []。これは、null で終わる (最後の文字が ASCII 0 -'\0'である) 文字の連続した配列であり、多くの場合、c では「文字列」と見なされます。

したがって、マクロを使用してルビ文字列をポインタに変換する必要がありますStringValueCStr(str)(strは String 変数です"./test.jpg")。のオプションもありStringValuePtr(str)、パフォーマンスの点では優れていますが、完全に安全というわけではありません。これは、c 文字列が null で終わるという事実を考慮していないため、文字列内に null ターミネータを含めることができないためです (どの Ruby 文字列が許可されているか)。StringValueCStr()一方、これを考慮に入れているため、有効な c 文字列があることが保証されます。

于 2018-06-18T23:33:37.883 に答える