这是我正在尝试使用的C函数的签名(它生成二进制数据数组):
long get_output( const unsigned char ** );
我用它来映射:
fun output = get_output( UInt8** ): Int32
在C中使用它的工作示例:
const unsigned char * data;
get_output( &data );
但是在Crystal:
data = uninitialized UInt8
MyLib.output( pointerof( pointerof( data ) ) ) # ERR: pointerof of pointerof not allowed
答案 0 :(得分:2)
这有效:
data = uninitialized UInt8*
MyLib.output(pointerof(data))
请注意,您拥有的参数为UInt8**
,因此您需要声明UInt8*
类型的变量。
然而,Crystal使用out
关键字非常好地支持这个习惯用法:https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/out.html
MyLib.output(out data)
# use data
这是最后一种方式,因为它更干,你不必重复这种类型。
另外要小心,通常很长时间映射到Int64。通常,LibC
下有一些好的别名,例如LibC::Char
,LibC::Long
等。