Я знаю, что Руст не поддерживает массивы переменной длины, но это оставляет мне интересно, что заменить их, при условии, что:Как конвертировать C массив переменной длины в Rust?
- Я не хочу выделять и освобождать крошечные VEC в цикле
- Заимствования проверка не позволяет мне двигаться код вне цикла
- Есть много ограничений на массивах фиксированного размера, так что я не могу понять, как использовать их
кода с I Преобразование процессов в изображение путем вызова обратного вызова по каждой строке, pa ssing небольшого массива указателей:
float *tmp[img->channels]; // Small, up to 4 elements
for(int y = 0; y < height; y++) {
for(int ch = 0; ch < img->channels; ch++) {
tmp[ch] = &img->channel[ch]->pixels[width * y];
}
callback(tmp, img->channels);
}
Моей Rust попытки (example in playpen):
for y in 0..height {
let tmp = &img.channel.iter().map(|channel| {
&mut channel.pixels.as_ref().unwrap()[width * y .. width * (y+1)]
}).collect();
callback(tmp);
}
Но это отвергнута:
a collection of type
[&mut [f32]]
cannot be built from an iterator over elements of type&mut [f32]
К сожалению, это звучит так же, как и то, что я пытался делать!
Я пробовал использовать массив фиксированного размера, но Rust не поддерживает дженерики на них, поэтому я не могу заполнить его из итератора, и я не могу заполнить их в C-подобном цикле, потому что ссылки, сделанные в цикле, не ожидают его.
the trait
core::iter::FromIterator<&mut [f32]>
is not implemented for the type[&mut [f32]; 4]
Другой подход с приемом кусочком памяти из массива фиксированного размера, также не:
let mut row_tmp: [&mut [f32]; 4] = unsafe{mem::zeroed()};
for y in 0..height {
row_tmp[0..channels].iter_mut().zip(img.chan.iter_mut()).map(|(t, chan)| {
*t = &mut chan.img.as_ref().unwrap()[(width * y) as usize .. (width * (y+1)) as usize]
});
cb(&row_tmp[0..channels], y, width, image_data);
}
error: cannot borrow
img.chan
as mutable more than once at a time
Это потрясающий Саймон, реквизит для создания его! –