请看下面的代码:
proc generateTuples(a: int, b: int, bNext: int): [] {
var tuples: [1..?] (int,int);
for q in (b+1)..(bNext-1) {
tuples.push([a, q]);
}
return tuples;
}
proc mergeLists(l1: [(int,int)], l2: [(int,int)]): [(int,int)] {
var result: [1..?](int,int);
var i1:int = 1;
var i2:int = 1;
while ((i1 <= l1.size) && (i2 <= l2.size)) {
if l1[i1] < l2[i2] {
result.push(l1[i1]);
i1 += 1;
} else {
result.push(l2[i2]);
i2 = i2+1;
}
}
result.append(l1[i1..l1.size]);
result.append(l2[i2..l2.size]);
return result;
}
proc generateTuplesSub(L: [1..?](int,int), start: int, end: int): [] (int,int) {
writeln(start," ",end);
if end <start {
var b: [1..0] (int,int);
return b;
}
var mid: int = (start + end) / 2;
var aMid = L[mid][0];
var bMid = L[mid][1];
var tuplesLeft = generateTuplesSub(L, start, mid);
var tuplesRight = generateTuplesSub(L, mid, end);
// Merge the tuples generated for the left and right halves
var result = mergeLists(tuplesLeft, tuplesRight);
// Add the tuples generated for the (aMid, bMid) pair
if mid < end - 1 {
var bNext = L[mid+1][1];
var tuplesMid = generateTuples(aMid, bMid, bNext);
result = mergeLists(result, tuplesMid);
}
return result;
}
// Example usage
var L = [(0, 4), (1, 5), (2, 6), (3, 7), (4, 8), (5, 10), (6, 12)];
var numProcesses = L.size;
var result = generateTuplesSub(L, 1,7);
for tup in result {
writeln("(", tup[1], ", ", tup[2], ")");
}
它是用Chapel编程语言编写的。我得到了以下错误:
called as generateTuplesSub(L: [domain(1,int(64),false)] 2*int(64), start: int(64), end: int(64))
note: generic instantiations are underlined in the above callstack.
什么意思?怎么办?我是用Mac的终端编译的,好像输入的类型有问题,但是我不明白。
当我想编译它的时候,我得到了错误。
1条答案
按热度按时间g6baxovj1#
当我compile your code with Chapel version 1.29时,我得到一个类似但不同的错误:
虽然这两个错误都不是很清楚,但我相信它们的来源都是表达式
1..?
,而Chapel(though we'd like it, or something like it, to be in certain contexts)目前并不支持该表达式。对于过程的形式参数,如第27行所示,您可以省略数组的索引,编译器将推断出它们。查看您的代码的其余部分,我看到其他差异,这向我表明,您可能使用的是一个更旧版本的Chapel或可能参考过时的Chapel文档或示例?
处理我在1.29中看到的其他编译器错误:
generateTuplesSub()
的返回类型不能被推断,因为它是一个递归过程,不幸的是,在这种情况下Chapel不能推断数组的索引,所以我认为你需要明确地输入一些东西(我最好的猜测是[1..<end-start]
可能是正确的,或者几乎是正确的?)[1..?]
上声明的局部数组同样需要给定大小,要么预先计算大小并直接在声明中使用它(在我看来,在这些情况下您应该能够做到这一点?),要么声明一个命名域变量并根据需要调整其大小(如果您能够准确计算大小,这将更加复杂和昂贵).push()
和.append()
例程,因此您需要重写这些操作来跟踪数组中数据应该存储到的下一个索引。[(int,int)]
,我认为您需要[] (int, int)
(或者可能是[lo..hi] (int, int)
,对于lo
和hi
的某个值)?tuples.push([a, q])
,[a, q]
是一个2元素的数组,我想你需要一个2元素的元组,所以应该写(a, q)
通过这些修改,我可以得到一个编译过的程序,但几乎可以肯定它没有计算出正确的答案(但几乎可以肯定是因为我猜错了你在做什么)如果你使用的是旧版本,我建议你升级到Chapel 1.29,看看你是否能完成我上面概述的一系列类似的修改,但犯的错误比我在副本中可能犯的要少。