c - 将 C 数组传递给 Rust 函数

标签 c arrays rust

我正在尝试制作一个 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 有很好的介绍 on the official site .

关于c - 将 C 数组传递给 Rust 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182843/

相关文章:

c++ - AsmJit 相当于 mov eax,[ecx+0CC]

c++ - 窄字符类型数组中的序列

javascript - 也许 PHP 还记得颜色?

Rust 在此上下文中必须知道此值的类型

rust - 意外的 T 与 &T 作为 Rust 中的类型参数

c - mbed CLI : make. py:错误:找不到 ARM 的可执行文件

C:大字符串输入 --> 段错误

c - 未处理的异常错误是什么意思?

javascript - 将逗号分隔的字符串转换为嵌套数组,RegExp?

dictionary - 检查给定单词是否存在于固定单词列表中的最快方法