2016-12-17 9 views
2

Dies ist eine Signatur einer C-Funktion, die ich zu verwenden bin versucht (was eine Reihe von binären Daten erzeugt):Kristall C-Bindungen: Argument const unsigned char **

long get_output(const unsigned char **); 

Und ich wo es sich mit :

fun output = get_output(UInt8**): Int32 

in C tut es ein funktionierendes Beispiel zu verwenden:

const unsigned char * data; 
get_output(&data); 

Aber in Crystal:

data = uninitialized UInt8 
MyLib.output(pointerof(pointerof(data))) # ERR: pointerof of pointerof not allowed 

Antwort

2

Dies funktioniert:

data = uninitialized UInt8* 
MyLib.output(pointerof(data)) 

Beachten Sie, dass das Argument, Sie haben, ist UInt8** so müssen Sie UInt8* eine Variable vom Typ deklarieren.

unterstützt jedoch Kristall dieses Idiom wirklich schön, mit dem out Stichwort: https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/out.html

MyLib.output(out data) 
# use data 

Dieser letzte Weg ist bevorzugt, weil es trocken ist, Sie müssen nicht die Art wiederholen.

Auch vorsichtig sein, lange meist Karten zu Int64. Im Allgemeinen gibt es gute Aliase unter LibC, zum Beispiel LibC::Char, LibC::Long usw.

+0

funktioniert wie ein Charme :) - danke asterite – Mat