gpt4 book ai didi

javascript - 通过 WebAssembly 将 Rust Vec> 返回给 JavaScript

转载 作者:行者123 更新时间:2023-11-29 08:09:18 28 4
gpt4 key购买 nike

我正在使用“wasm32-unknown-unknown”目标开发一个涉及 Rust 和 WebAssembly 的项目。返回一个Vec<i32>是没问题的从我的 Rust 代码中使用这个函数:

#[no_mangle]
pub extern "C" fn calc_vector() -> usize {
unsafe {
vec_len = 0;
}

let mut data: Vec<i32> = Vec::new();

for i in 0..1000 {
data.push(i);
}

unsafe {
vec_len = data.len();
}

data.as_mut_ptr() as usize
}

这会返回一个偏移量,我从 JS 调用另一个函数来获取我的 Vec 的长度.然后我再次用 JavaScript 构建 Vector(知道 i32 -> 4x uint8 ):

let vec_addr = exports.calc_vector();
let vec_len = exports.get_vec_len();

while(arr.length < vec_len) {
let numberUint8 = new DataView(view.buffer, vec_addr, 4);
let number = numberUint8.getInt32(0, true);
arr.push(number)

// move to next value in vector
vec_addr += 4;
}

使用它,我想创建一个返回 Vec<Vec<i32>> 的 Rust 函数, 但是,它只是行不通:

#[no_mangle]
pub extern "C" fn calc_vector_in_vector() -> usize {
unsafe {
vec_len = 0;
elements_in_vect = 0;
}

let mut outer_vec: Vec<*mut i32> = Vec::new();
let mut inner_vec: Vec<i32> = Vec::new();

for i in 0..100 {
inner_vec.push(i);
unsafe {
elements_in_vect += 1;
}
}

outer_vec.push(inner_vec.as_mut_ptr());

unsafe {
vec_len = outer_vec.len();
}

outer_vec.as_mut_ptr() as usize
}

我认为我可以使用与单个 Vec 相同的逻辑: 在从 calc_vector_in_vector() 返回的地址是外部向量的第一个条目,包含地址 i32内部向量的第一个元素(实际数字)。但是,在这个地址上似乎是胡说八道。我在这里做错了什么?

最佳答案

因为我的向量中的向量都是相同长度的,所以我可以使用 lazy_static crate 来初始化一个静态的 Vec 包裹在一个 Mutex 中(以便能够改变稍后)。 LEN_VEC 是向量的长度,SIZE_INNER_VEC 是我的静态向量中一个向量的大小。

然后我将 i32 添加到静态向量并使用 ARRAY.lock().unwrap().as_mut_ptr() 返回 Vec 的地址使用大小。使用 SIZE_INNER_VECLEN_VEC,我可以用 JavaScript 在我的向量中重新创建向量。

static mut LEN_VEC: usize = 0;
static mut SIZE_INNER_VEC: usize = 0;

lazy_static! {
// Wrap in Mutex to change later on
static ref ARRAY: Mutex<Vec<i32>> = Mutex::new(vec![]);
}

pub fn vector_in_vector() -> usize {
//set LEN_VEC
//set SIZE_INNER_VEC

ARRAY.lock().unwrap().as_mut_ptr() as usize
}

关于javascript - 通过 WebAssembly 将 Rust Vec<Vec<i32>> 返回给 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52352749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com