Кто-нибудь может подсказать, как передать в функцию двумерный массив?
Желательно по ссылке, т.е. без копирования самого массива. К сожалению их "книга" пока не богата на примеры передачи параметров в функцию. Вот как я себе это пытался представить:
fn foo(a:&[&[f64]],x:&[f64])
{
for i in 0..3 {
for j in 0..4 {
println!("{}",a[i][j]);
}
}
}
fn main()
{
let A:[[f64;4];3]=[[1.1,-0.2, 0.1,1.6],
[0.1,-1.2,-0.2,2.3],
[0.2,-0.1, 1.1,1.5]];
let mut X:[f64;3]=[0.0;3];
foo(&A,&X);
}
"X" передается без проблем, а вот на "А" ругается при всех комбинациях [ ] и &, которые я смог придумать:
src/main.rs:16:6: 16:8 error: mismatched types:
expected `&[&[f64]]`,
found `&[[f64; 4]; 3]`
(expected slice,
found array of 3 elements) [E0308]
src/main.rs:16 foo(&A,&X);
^~
error: aborting due to previous error
Could not compile `example`.
Ответ
Дело в том, что, к примеру, выражение [1i32, 2, 3] возвращает тип [i32; 3] — массив с заданной при компляции длиной. Когда же &[f64] является срезом — ссылочным типом, состоящим из указателя на массив и длины (известной во время выполнения).
Вот так будет работать:
fn foo(a:&[&[f64]],x:&[f64])
{
for i in 0..3 {
for j in 0..4 {
println!("{}",a[i][j]);
}
}
}
fn main()
{
let a:[&[f64];3]=[&[1.1,-0.2, 0.1,1.6],
&[0.1,-1.2,-0.2,2.3],
&[0.2,-0.1, 1.1,1.5]];
let x:[f64;3]=[0.0;3];
foo(&a,&x);
}
К сожалению их "книга" пока не богата на примеры передачи параметров в функцию.
Кроме собственно официальной документации по Rust существует очень хорошее руководство с множеством прекрасных примеров Rust by Example
Комментариев нет:
Отправить комментарий