在尝试将矩阵中的所有元素相加时,当我使用 forall 循环时,我不断收到错误,它使用 for 循环工作,我不知道为什么。
这是错误:
error: illegal lvalue in assignment
法典:
config const size = 10;
var grid : [1..size, 1..size] real;
var sum : real = 0;
//for user input
for i in 1..size do
for j in 1..size do
grid[i,j] = read(uint(8));
forall i in 1..size {
forall j in 1..size {
sum += grid[i,j]; //error here
}
}
编译器阻止您在sum
上进行数据竞速。如果允许代码,则外部和内部 forall-loop 的多次迭代将同时更新同一变量而不同步。因此,编译器会强制循环体中的sum
是外部sum
的只读快照。这种机制称为"所有意图"。在线文档中对此进行了讨论。
如果你打算把矩阵中的所有元素相加,那么chpl-erific的方法是:
const sum = + reduce grid;
代码的其他变体也是可能的,具体取决于您要完成的内容。
旁白:在二维空间上有一个单一的forall更有效,例如:
forall (i,j) in {1..size,1..size} // {1..size,1..size} is a "domain"
或者,更好的是:
forall (i,j) in grid.domain