我正在开发一个涉及Rust和WebAssembly的项目,使用"wasm32-unknown-unknown"目标。使用以下函数从我的Rust代码返回Vec<i32>
没有问题:
#[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;
}
我想创建一个Rust函数,返回一个Vec<Vec<i32>>
,但是它却无法工作:
#[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()
返回的地址处是外部向量的第一个条目,它包含内部向量的第一个元素(实际数字)的地址。然而,在这个地址上似乎有些荒谬的东西。我在这里做错了什么?
Vec
的方法。 - Shepmaster