chapel - 尝试使用 forall 循环对矩阵中的所有元素求和时遇到错误
问题描述
在尝试将矩阵中的所有元素相加时,我在使用 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 循环的多次迭代将同时更新同一个变量而无需同步。因此,编译器强制sum
循环体成为外部的只读快照sum
。这种机制称为“forall intents”。在线文档中对此进行了讨论。
如果您的意图是将矩阵中的所有元素相加,那么 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
推荐阅读
- postgresql - 使用命令复制将 csv 加载到 postgresql
- celery - Celery with Django mongoDB:worker logs show UserWarning: MongoClient opens before fork
- javascript - 如何在javascipt中将相同的id和函数应用于多行
- next.js - 如果我想在构建期间静态生成站点,如何在 Next.js 中设置状态?
- c++ - 为什么 memset 在苹果 clang 编译器中工作错误?
- c# - 如何使用 Action 声明 c# 构造函数
参数(就像在 C 中传递一个指向 func 的指针) - amazon-web-services - 速率限制/调度 AWS Cognito 操作以避免 TooManyRequestsException
- javascript - force:hasRecordId 接口不提供来自“new”按钮覆盖的recordId
- java - 在 android studio libjni.so 中出现错误:有文本重定位
- android-recyclerview - if语句不检查通过滚动recyclerview达到的edittexts的值