Это сигнатура функции 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
2
Mat 17 Дек 2016 в 14:16

1 ответ

Лучший ответ

Это работает:

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

Последний способ предпочтительнее, потому что он более СУХИЙ, вам не нужно повторять тип.

Также будьте осторожны, long обычно сопоставляется с Int64. Как правило, в разделе LibC есть хорошие псевдонимы, например LibC::Char, LibC::Long и т. Д.

3
asterite 17 Дек 2016 в 18:37