bell 发表于 2021-09-07 21:36
C 使用malloc生成一个动态长度的数组,具体类型可知。C如何传递给rust 才能使rust知道该数组的长度和地址?
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; }
https://doc.rust-lang.org/std/vec/struct.Vec.html#method.from_raw_parts
RUST 端传入 指定类型的数组指针(float类型的数组)和一个数组的长度指针,C这边malloc后,将数组首地址和数组长度传出,关键rust这边如何解析这个数据,并将数据写入rust侧?
-- 👇 Mike Tang: 传入一个原始结构指针过来,外加一个长度。
-- 👇 gwy15: 你返回一个结构体不就行了,或者在入参传一个栈上的地址让C侧写入
参见:
link
传入一个原始结构指针过来,外加一个长度。
你返回一个结构体不就行了,或者在入参传一个栈上的地址让C侧写入
评论区
写评论https://doc.rust-lang.org/std/vec/struct.Vec.html#method.from_raw_parts
RUST 端传入 指定类型的数组指针(float类型的数组)和一个数组的长度指针,C这边malloc后,将数组首地址和数组长度传出,关键rust这边如何解析这个数据,并将数据写入rust侧?
--
👇
Mike Tang: 传入一个原始结构指针过来,外加一个长度。
RUST 端传入 指定类型的数组指针(float类型的数组)和一个数组的长度指针,C这边malloc后,将数组首地址和数组长度传出,关键rust这边如何解析这个数据,并将数据写入rust侧?
--
👇
gwy15: 你返回一个结构体不就行了,或者在入参传一个栈上的地址让C侧写入
参见:
link
传入一个原始结构指针过来,外加一个长度。
你返回一个结构体不就行了,或者在入参传一个栈上的地址让C侧写入