类字段/数组元素用作循环计数器报错,是否因需为标量变量?
Chapel中循环计数器必须是标量变量吗?
没错,你猜的完全对——Chapel的for-in循环确实要求循环计数器必须是标量变量,类字段、数组元素这类左值表达式没法直接当作循环计数器使用,这就是你触发error: invalid index expression错误的核心原因。
为什么会报错?
Chapel的for循环在迭代时,需要将每次的迭代值赋值给计数器。虽然类字段(比如你的x.n)、数组元素(比如k[1])都是可以被赋值的左值,但Chapel的语法规则里明确限定了:循环计数器必须是一个独立的标量变量标识符,不能是字段访问、数组元素访问这类复杂表达式。
修正你的代码
要实现你想要的效果(把迭代值同步到类字段或数组元素中),只需要先声明一个标量变量作为循环计数器,然后在循环体里把计数器的值赋值给目标字段/元素即可:
class Cls { var n: int; } proc main() { var x = new Cls( 100 ); var k: [1..10] int; // 修正类字段的循环 for i in 1..3 do { x.n = i; writeln( x.n ); } // 修正数组元素的循环 for j in 1..3 do { k[1] = j; writeln( k[1] ); } }
这样既符合Chapel的语法规范,也能达到你原本想要的迭代更新效果。
内容的提问来源于stack exchange,提问作者roygvib
相关产品推荐
相关产品推荐

