2016-08-29 3 views
3

녹에서 F30 함수가 필요하고 고정 된 크기의 배열을 허용하려고합니다. C 코드는 다음과 같이 전달됩니다.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를 사용하고 올바른 유형으로 버리는 수 있습니다.