Это сигнатура функции 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
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
и т. Д.
Похожие вопросы
Новые вопросы
crystal-lang
Crystal - это язык программирования с синтаксисом, основанным на Ruby, но статически проверенный на тип и скомпилированный в собственный и эффективный код.