将C数组传递给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”错误。

iz

您必须付出一些努力以提供纯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有很好的介绍

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++直接将数组传递给函数

来自分类Dev

将数组传递给C中的函数

来自分类Dev

将char数组传递给函数C ++

来自分类Dev

C ++将指针数组传递给函数

来自分类Dev

将数组传递给类函数C ++

来自分类Dev

将数组传递给函数

来自分类Dev

将数组传递给函数

来自分类Dev

将Python列表传递给Rust函数

来自分类Dev

将数组传递给函数-指针与引用(C ++与C)

来自分类Dev

将2d数组传递给C ++中的函数

来自分类Dev

将2D数组传递给c中的函数

来自分类Dev

从Go将结构和结构数组传递给C函数

来自分类Dev

C编程,将char数组传递给函数

来自分类Dev

将2D数组传递给C函数

来自分类Dev

将字符串数组传递给C中的函数

来自分类Dev

将字符指针数组传递给C函数

来自分类Dev

将String数组作为输入传递给外部C函数

来自分类Dev

将数组的指针传递给C中的函数

来自分类Dev

C将void指针数组传递给函数

来自分类Dev

C指针,了解如何将数组传递给函数

来自分类Dev

将数组作为参数传递给C函数

来自分类Dev

将3维数组传递给C中的函数

来自分类Dev

C18将char数组传递给函数

来自分类Dev

C ++将字符串数组传递给函数

来自分类Dev

将结构数组传递给函数作为指针(C)

来自分类Dev

将指针传递给char数组作为函数的参数-C

来自分类Dev

将特定大小的数组传递给C中的函数

来自分类Dev

将结构数组传递给C中的值函数

来自分类Dev

C:将嵌套结构数组传递给函数