2

これは、使用しようとしている C 関数の署名です (バイナリ データの配列を生成します)。

long get_output( const unsigned char ** );

そして、私はそれを次のようにマッピングします:

fun output = get_output( UInt8** ): Int32

Cでそれを使用する実際の例は次のとおりです。

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

しかしクリスタルでは:

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

1 に答える 1

3

これは機能します:

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

あなたが持っている引数はUInt8**なので、 type の変数を宣言する必要があることに注意してくださいUInt8*

ただし、Crystal は、outキーワードhttps://crystal-lang.org/docs/syntax_and_semantics/c_bindings/out.htmlでこのイディオムをうまくサポートしています

MyLib.output(out data)
# use data

この最後の方法は、より DRY であり、タイプを繰り返す必要がないため、推奨されます。

long は通常 Int64 にマップされることにも注意してください。一般に、、 などの下LibCには適切なエイリアスがあります。LibC::CharLibC::Long

于 2016-12-17T15:37:19.700 に答える