< 返回版块

bell 发表于 2021-09-07 21:36

C 使用malloc生成一个动态长度的数组,具体类型可知。C如何传递给rust 才能使rust知道该数组的长度和地址?

评论区

写评论
Bai-Jinlin 2021-09-08 09:48
use std::os::raw::{c_float, c_size_t};
use std::slice;
use std::ffi::c_void;
#[repr(C)]
struct Ret {
    ptr: *const c_float,
    size: c_size_t,
}
impl Ret{
    fn from_slice(s:&[f32])->Self{
        unsafe { foo(s.as_ptr(), s.len()) }
    }
    fn as_slice(&self)->&[f32]{
        unsafe {
            slice::from_raw_parts(self.ptr, self.size)
        }
    }
}
impl Drop for Ret{
    fn drop(&mut self) {
        unsafe { free(self.ptr.cast()); }
    }
}
#[link(name = "foo")]
extern "C" {
    fn foo(ptr: *const c_float, size: c_size_t) -> Ret;
    fn free(ptr:*const c_void);
}
fn main() {
    let a: [f32; 2] = [1., 2.];
    let ret=Ret::from_slice(&a);
    println!("{:?}", ret.as_slice());
}
#include<stdlib.h>
#include<string.h>
struct Ret{
    float *ptr;
    size_t size;
};
struct Ret foo(const float *ptr,size_t size){
    float *p=malloc(sizeof(float)*size);
    for (size_t i=0;i<size;i++)
        p[i]=ptr[i];
    struct Ret ret= {p,size};
    return ret;
}
Grobycn 2021-09-08 09:02

https://doc.rust-lang.org/std/vec/struct.Vec.html#method.from_raw_parts

作者 bell 2021-09-08 08:43

RUST 端传入 指定类型的数组指针(float类型的数组)和一个数组的长度指针,C这边malloc后,将数组首地址和数组长度传出,关键rust这边如何解析这个数据,并将数据写入rust侧?

--
👇
Mike Tang: 传入一个原始结构指针过来,外加一个长度。

作者 bell 2021-09-08 08:43

RUST 端传入 指定类型的数组指针(float类型的数组)和一个数组的长度指针,C这边malloc后,将数组首地址和数组长度传出,关键rust这边如何解析这个数据,并将数据写入rust侧?

--
👇
gwy15: 你返回一个结构体不就行了,或者在入参传一个栈上的地址让C侧写入

Mike Tang 2021-09-07 22:51

参见:

link

Mike Tang 2021-09-07 22:50

传入一个原始结构指针过来,外加一个长度。

gwy15 2021-09-07 22:06

你返回一个结构体不就行了,或者在入参传一个栈上的地址让C侧写入

1 共 7 条评论, 1 页