当尝试将矩阵中的所有元素加起来时,在使用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
}
}
答案 0 :(得分:2)
编译器阻止您进行sum
上的数据竞赛。如果您的代码被允许,则外部和内部forall循环的多次迭代将同时更新同一变量,而无需同步。因此,编译器会强制循环主体中的sum
是外部sum
的只读快照。此机制称为“全部意图”。在online documentation中进行了讨论。
如果您打算将矩阵中的所有元素相加,则最有用的方法是:
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