Я работаю над проектом с использованием Rust и WebAssembly, использующим цель «wasm32-unknown-unknown». Нет проблем вернуть 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 (зная, что 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()
, находится первая запись внешнего вектора, содержащая адрес как i32
первого элемента внутренний вектор (фактическое число). Однако по этому адресу, похоже, чепуха. Что я здесь не так делаю?