2016-08-29 25 views
3

Rustにextern "C" FFI関数が必要で、固定サイズの配列を受け入れる必要があります。 Cコードは次のように渡されます:RustでCの配列へのポインタを表現する方法

// C code 
extern int(*)[4] call_rust_funct(unsigned char (*)[3]); 
.... 
unsigned char a[] = { 11, 255, 212 }; 
int(*p)[4] = call_rust_funct(&a); 

どのように錆機能を書きますか?

// Pseudo code - DOESN'T COMPILE 
pub unsafe extern "C" fn call_rust_funct(_p: *mut u8[3]) -> *mut i32[4] { 
    Box::into_raw(Box::new([99i32; 4])) 
} 
+1

これはポインタなので、extern関数のシグネチャで '* mut std :: os :: raw :: c_void'を使用し、正しい型に変換することができます。 –

+0

@PavelStrakhov:それは答えです:) –

+0

@PavelStrakhov正しい型を使うと 'void *'を使うより型の安全性があるので、最後の手段として使うだけです。これは錆びないのですか? – ustulation

答えて

6

あなただけの固定サイズの配列のための錆の構文を使用する必要があります。

pub unsafe extern "C" fn call_rust_funct(_p: *mut [u8; 3]) -> *mut [i32; 4] { 
    Box::into_raw(Box::new([99i32; 4])) 
} 

それとも、いつも*mut std::os::raw::c_voidを使用し、正しいタイプに核変換することができます。

関連する問題