我正在尝试返回对数组切片的引用,但是我得到了以下编译时错误(其中有问题的行在 slice
test.chpl:9:错误:ref返回非法表达式
返回完整数组工作正常,就像在主程序中引用切片一样.
有没有正确的方法将ref返回到切片?提前致谢!
record R {
var A : [0.. #10] int;
proc full() ref {
return A;
}
proc slice() ref {
return A[0.. #5];
}
}
var r : R;
ref x1 = r.full();
ref x2 = r.slice();
ref x3 = x1[0.. #5];
Run Code Online (Sandbox Code Playgroud)
只是为了完整性:
chpl版本1.16.0预发布(2659cc6)
Chapel域有两组方法
domain.low, domain.high
Run Code Online (Sandbox Code Playgroud)
和
domain.first, domain.last
Run Code Online (Sandbox Code Playgroud)
什么是这些返回不同结果的各种情况(即什么时候domain.first != domain.low和domain.last != domain.high?
教堂减少目前忽略变量的初始值.这意味着这段代码
var x: int;
for i in 1..3 {
forall j in 1..10 with (+ reduce x) {
x += 1;
}
}
writeln(x);
Run Code Online (Sandbox Code Playgroud)
返回10而不是30,正如这位用户天真地想到的那样.虽然这种行为很好(并且它在减少条款的注释中有记载 - 我只是没有想到它),但事实证明,如果我想得到30(通过在两个循环中累积),我需要实际上是手工完成.我认为它会非常优雅和对称的for循环也reduce有意图....即我想写
var x: int;
for i in 1..3 with (+ reduce x) {
forall j in 1..10 with (+ reduce x) {
x += 1;
}
}
writeln(x);
Run Code Online (Sandbox Code Playgroud)
请注意,即使在求和数字的情况下,我也需要引入一个临时变量.对于最大/最小的操作,需要更加小心.
是否有理由不支持reducefor循环中的意图?或者,有没有更惯用(Chapel-rrific)的方式来做到这一点?
更新:我越是想到这一点,我提出的代码在外部for被a替换的情况下不起作用并不明显forall.我认为问题在于变量是任务本地的而不是迭代本地的,因此减少只会发生在任务上.因此,仍然需要一个单独的内部缩减步骤.这将删除的是需要一个临时变量.
我认为更为重要的问题是,进行这些嵌套缩减的正确方法是......
假设我有一个Chapel字符串
var s : string;
Run Code Online (Sandbox Code Playgroud)
我如何将它发送到期望char*(自c_string假设const char *)的函数?
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么?
我能看到的最好的方法是检查D1==D2和D1.dist==D2.dist,如果D1和D2都是域。
特别地,请考虑以下代码:
const Dom = {1..5, 1..5};
const BDom = newBlockDom(Dom);
var x : [Dom] int;
var y : [BDom] int;
test(x,y);
proc test(a : [?Dom1] int, b : [Dom1] int) {
}
Run Code Online (Sandbox Code Playgroud)
这编译并运行得很好,如果函数声明中的查询语法只是测试域相等性,而不是分布相等性(即使Dom1也知道如何a分布),这是有道理的。在这种情况下检查分布相等的唯一方法是做a.domain.dist==b.domain.dist什么?