Chapel中如何正确查询泛型一维实数组参数的domain?
解决Chapel泛型数组函数中域查询的问题
你的问题出在对泛型参数绑定的理解上:在proc foo(u : [?D] ?T)这个声明里,?T绑定的是数组的元素类型(比如real),而非数组类型本身。元素类型属于基本数据类型,并没有domain属性,所以调用T.domain会报错。
下面是两种符合需求的正确写法:
写法一:直接约束元素为实型并绑定域
如果你的核心需求是接收一维实数组,可以直接将元素类型指定为real,同时用?D绑定数组的域:
proc foo(u: [?D] real) { // 直接用D访问数组的域 writeln("数组的域范围: ", D); writeln("数组元素个数: ", D.size); } // 调用示例 var myArr: [0..3] real = [0.5, 1.5, 2.5, 3.5]; foo(myArr);
写法二:将数组类型作为泛型参数
如果你确实需要把数组类型本身作为泛型参数(而非元素类型),可以通过where子句约束数组的元素为实型且维度为1,此时?T绑定的就是数组类型,就能正常使用T.domain:
proc foo(u: ?T where T is array(?, real) && T.rank == 1) { // T是数组类型,T.domain获取域的类型 writeln("数组的域类型: ", T.domain); // 若要获取当前数组实例的具体域,用u.domain writeln("当前数组的域范围: ", u.domain); } // 调用示例 var myArr: [1..5] real = [1.0, 2.0, 3.0, 4.0, 5.0]; foo(myArr);
总结一下:
- 当用
[?D] ?T声明参数时,D是数组的域,T是元素类型 - 若要操作数组的域,直接使用绑定的
D即可;如果要通过数组类型获取域,需调整泛型参数的绑定方式,让T指向数组类型而非元素类型
内容的提问来源于stack exchange,提问作者cfdlab
相关产品推荐
相关产品推荐

