В следующем коде я назначаю фиктивные (тестовые) значения всем элементам 2-мерного массива (a[][]
), а затем проверяю, заполнен ли массив должным образом. При использовании строки (A) код работает должным образом (т. Е. Печатает "passed"
).
proc test()
{
const N = 1000;
var a: [1..N, 1..3] real = (for m in 1 .. (3 * N) do (1.0 / m)); // (A)
// var a: [1..N, 1..3] real = [m in 1 .. (3 * N)] (1.0 / m); // (B)
// var a: [1..N, 1..3] real = forall m in 1 .. (3 * N) do (1.0 / m); // (C)
var m = 0;
for i in 1 .. N {
for k in 1 .. 3 {
m += 1;
assert( abs( a[i, k] - 1.0 / m ) < 1.0e-10 );
}
}
writeln("passed");
}
test();
С другой стороны, если я использую строку (B) или (C) вместо (A) код дает эту ошибку:
test.chpl: 7: error: итерация по диапазону с многомерным итератором
Мне интересно в чем смысл этого сообщения об ошибке? (Я ожидаю, что правая часть присваивания оценивается первой, т. Е. Временный массив создается параллельно и назначается левой стороне. Но разве это ожидание неверно?)
( Мне также интересно, допустимо ли назначать одномерный массив двухмерному массиву (как в строке (A)) без изменения формы ...?)