Разница между "for" и "forall" в правой части присваивания - PullRequest
3 голосов
/ 04 августа 2020

В следующем коде я назначаю фиктивные (тестовые) значения всем элементам 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)) без изменения формы ...?)

...