chapel - 函数返回一个关联数组
问题描述
如何让函数在 Chapel 中返回关联数组?这是自然的,但似乎不起作用:
type keys = domain(int);
type arr = [keys] int;
proc factor(q): arr {
...
}
我得到的错误输出是:
error: unresolved call 'chpl__ensureDomainExpr(type DefaultAssociativeDom(int(64),true))'
$CHPL_HOME/modules/internal/ChapelArray.chpl:642: note: candidates are: chpl__ensureDomainExpr(const ref x: domain)
$CHPL_HOME/modules/internal/ChapelArray.chpl:649: note: chpl__ensureDomainExpr(x ...)
解决方案
这是一个执行此操作的工作程序:
proc returnsAssocArray() {
var AssocDom:domain(int);
var AssocArray:[AssocDom] int;
AssocArray[1] = 100;
return AssocArray;
}
var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
writeln("A[", key, "] = ", value);
}
以上是我会使用的模式,并且可能会做你想要的。
请注意,Chapel 中的数组和域具有运行时关系,并且数组的类型包括运行时域。因此,虽然您发布的代码有一天可能会起作用,但一般来说,要指定一个数组类型,需要指定一个在运行时可用的域。
假设您希望在所有返回的关联数组中共享一个域(也就是一组键),您可以这样做:
var AssocDom:domain(int);
AssocDom += 1; // add index 1 to the associative domain
type AssocArrayType = [AssocDom] int;
proc returnsAssocArray(): AssocArrayType {
var AssocArray:AssocArrayType;
AssocArray[1] = 100;
return AssocArray;
}
var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
writeln("A[", key, "] = ", value);
}
但是,如果returnsAssocArray
想添加2
到域中(比如说),事情可能不会像你期望的那样工作:
- 添加
2
到 AssocDom 将调整在该域上创建的任何其他数组的大小 - 仅
AssocArray[2] = 100
当没有其他阵列共享该域时,才会添加到域中。
未来版本的 Chapel 很可能会有一种Map
类型来简化此类用例并提供更熟悉的地图界面。此外,如果没有其他数组共享它,则添加到关联域的规则很可能会消失。
推荐阅读
- reactjs - TypeScript React onChanged:尝试在共享点中执行 Web 部件时出错
- reactjs - Ant 设计排序表代码不适用于反应打字稿
- graphql - 为 NestJs GraphQL 查询装饰器设置多种返回类型
- python - 文本位置不显示在情节上
- wordpress - 在 htaccess 中正确重定向到 www
- user-interface - 如何在没有状态构建器的情况下在flutter中更新SimpleDialog,就像使用一样,外部的值不会更新
- android - Flutter:如何自定义从下到上剪辑图像?
- python-3.x - 修复 'ImmutableDenseNDimArray' 对象没有属性 'could_extract_minus_sign'
- kubernetes - 在 GKE 上为 nginx 入口使用静态 IP 时,通过 helm 安装的 Jenkins 未公开
- php - 让 Apache 通过 PHP FPM 传递 JS 文件