Я пытаюсь сделать ржавчину dylib и использовать ее с других языков, таких как C, Python и другие. Я успешно вызвал функцию функции Rust и аргумент i32 из python. Теперь я пытаюсь сделать функцию, которая принимает массив (указатель на него или все необходимое для передачи набора данных в Rust lib).Передайте массив C в функцию Rust
#![crate_type = "dylib"]
#[no_mangle]
pub extern fn rust_multiply(size: i32, arrayPointer: &i32) -> i32
{
*(arrayPointer)
}
Это работает должным образом. Но
#![crate_type = "dylib"]
#[no_mangle]
pub extern fn rust_multiply(size: i32, arrayPointer: &i32) -> i32
{
*(arrayPointer + 1) // trying to get next element
}
терпит неудачу с
src/lib.rs:5:2: 6:2 error: type `i32` cannot be dereferenced
src/lib.rs:5 *(arrayPointer + 1)
src/lib.rs:6 }
Кроме этого:
pub extern fn rust_multiply(size: i32, array: &[i32]) -> i32
и делать что-то вроде array[0]
терпит неудачу с "длина = 0" ошибки.
Возможно, вы не хотите иметь функции 'extern', которые принимают' i32' или ссылки (например, '& i32'). Лучше использовать типы C, которые гарантированно соответствуют вашей платформе - 'libc :: uint32_t', как показано в ответе. Кроме того, ссылки Rust * гарантированы * как не-NULL, но нет ничего, что обеспечивало бы это, когда вы отказываетесь от FFI. Было бы безопаснее принять '* const libc :: uint32_t' (опять же, как показано в ответе), а затем утверждать, что он не является NULL, прежде чем превращать его в ссылку. – Shepmaster