2016-12-17 6 views
2

이 내가 (이진 데이터의 배열을 생성하는)를 사용하기 위해 노력하고있어 C 함수의 서명입니다 :크리스탈 C 바인딩 : 인수 CONST 서명 숯불 **

long get_output(const unsigned char **); 

내가 그것을지도 :

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

하지만 크리스탈의를 : : C에서

fun output = get_output(UInt8**): Int32 

작업 예제는 어떻게 사용하는

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

답변

2

이 작동합니다 : 당신이 인수가 UInt8** 그래서 당신이 유형 UInt8*의 변수를 선언 할 필요가있다

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

하는 것으로.

그러나 크리스탈은 out 키워드로, 정말 잘이 관용구를 지원합니다 https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/out.html

MyLib.output(out data) 
# use data 

이 마지막 방법은 더 DRY이기 때문에, 당신은 유형을 반복 할 필요가 없습니다 바람직하다.

또한 대개 Int64에 매핑되므로주의하십시오. 일반적으로 아래에 좋은 별칭이 있습니다 (예 : LibC::Char, LibC::Long 등).

+0

은 매력처럼 작동합니다. :) - 감사합니다. – Mat