簡體   English   中英

將 C 數組傳遞給 Rust 函數

[英]Pass a C array to a Rust function

我正在嘗試制作 Rust dylib 並從其他語言(如 C、Python 和其他語言)中使用它。 我已經成功地調用了一個 Rust 函數,它從 Python 中獲取了一個 i32 參數。 現在我正在嘗試創建一個函數,它接受一個數組(或指向它的指針,或者任何將數據集傳遞給 Rust 所需的東西)。

#![crate_type = "dylib"]
#[no_mangle]
pub extern "C" fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 {
    *(arrayPointer)
}

這按預期工作。

#![crate_type = "dylib"]
#[no_mangle]
pub extern "C" fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 {
    *(arrayPointer + 1) // trying to get next element
}

失敗

error[E0614]: type `i32` cannot be dereferenced
 --> src/lib.rs:4:5
  |
4 |     *(arrayPointer + 1) // trying to get next element
  |     ^^^^^^^^^^^^^^^^^^^

這樣做:

pub extern fn rust_multiply(size: i32, array: &[i32]) -> i32

並且執行類似array[0]失敗並出現“length = 0”錯誤。

您必須努力提供純 C API 並使用不安全的代碼實現一些轉換。 幸運的是,這並不難:

extern crate libc;

#[no_mangle]
pub extern "C" fn rust_multiply(
    size: libc::size_t,
    array_pointer: *const libc::uint32_t,
) -> libc::uint32_t {
    internal_rust_multiply(unsafe {
        std::slice::from_raw_parts(array_pointer as *const i32, size as usize)
    }) as libc::uint32_t
}

fn internal_rust_multiply(array: &[i32]) -> i32 {
    assert!(!array.is_empty());
    array[0]
}

官方網站上對 Rust FFI 有很好的介紹。

@swizard 的答案獲取無符號整數並將它們轉換為有符號整數。 你可能想要的代碼是

extern crate libc;

#[no_mangle]

pub extern "C" fn rust_multiply(
    size: libc::size_t,
    array_pointer: *const libc::int32_t,
) -> libc::int32_t {
    internal_rust_multiply(unsafe {
        std::slice::from_raw_parts(array_pointer as *const i32, size as usize)
    }) as libc::int32_t
}

fn internal_rust_multiply(array: &[i32]) -> i32 {
    assert!(!array.is_empty());
    array[0]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM