如何在 Chapel 中指定一个 return 的未知大小的数组
How to specify a return of an array of unknown size in Chapel
我试图依靠类型推断来获得带有签名的函数:
proc mode(data: [?]int)
但是编译器说它无法解析 return 类型(我猜这本身就是一个警告,因为只有两个 return 语句)。我试过:
proc mode(data: [?]int): [?]int
但是编译器然后说有一个内部错误:
internal error: CAL0057 chpl Version 1.13.1.518d486
指定由函数编辑的数组长度 return 只能在 运行 时间知道的正确方法是什么?
如果被return编辑的数组的domain/size不能在函数原型中直接描述,我相信你目前最好的选择是省略对return的任何描述type 并依靠 Chapel 的类型推断机制来确定您正在 returning 数组(正如您尝试的那样)。例如,这里有一个过程,它读取一个以前未知大小的数组并 returns 它:
proc readArrFromConsole() {
var len = stdin.read(int);
var X: [1..len] real;
for x in X do
x = stdin.read(real);
return X;
}
var A = readArrFromConsole();
writeln(A);
运行 它并在控制台输入:
3 1.2 3.4 5.6
生成:
1.2 3.4 5.6
您的问题提到了多个 return 语句,这引发了关于 Chapel 跨不同数组统一类型的积极程度的问题。一个包含多个相同类型数组(每个数组都有唯一的域、大小和边界)的简单示例似乎可行:
proc createArr() {
var len = stdin.read(int);
if (len > 0) {
var X: [1..len] real;
return X;
} else {
var Y: [-1..1] real;
return Y;
}
}
var A = createArr();
writeln(A);
要了解为什么编译器无法解析示例中的 return 类型,可能需要有关您的过程主体/return 语句包含的内容的更多信息。
我在递归函数中时常遇到这种情况,在省略 return 类型失败的情况下;在这种情况下,我创建了一个 record
,它是一个具有域的数组,例如:
record stringarray {
var D: domain(1);
var strs : [D] string;
}
然后将递归数组定义为 return 这些记录之一:
proc repeats() : stringarray {
var reps: stringarray;
//...
for child in children do {
childreps = child.repeats();
for childrep in childreps do
reps.push_back(childrep);
}
//...
return reps;
}
我试图依靠类型推断来获得带有签名的函数:
proc mode(data: [?]int)
但是编译器说它无法解析 return 类型(我猜这本身就是一个警告,因为只有两个 return 语句)。我试过:
proc mode(data: [?]int): [?]int
但是编译器然后说有一个内部错误:
internal error: CAL0057 chpl Version 1.13.1.518d486
指定由函数编辑的数组长度 return 只能在 运行 时间知道的正确方法是什么?
如果被return编辑的数组的domain/size不能在函数原型中直接描述,我相信你目前最好的选择是省略对return的任何描述type 并依靠 Chapel 的类型推断机制来确定您正在 returning 数组(正如您尝试的那样)。例如,这里有一个过程,它读取一个以前未知大小的数组并 returns 它:
proc readArrFromConsole() {
var len = stdin.read(int);
var X: [1..len] real;
for x in X do
x = stdin.read(real);
return X;
}
var A = readArrFromConsole();
writeln(A);
运行 它并在控制台输入:
3 1.2 3.4 5.6
生成:
1.2 3.4 5.6
您的问题提到了多个 return 语句,这引发了关于 Chapel 跨不同数组统一类型的积极程度的问题。一个包含多个相同类型数组(每个数组都有唯一的域、大小和边界)的简单示例似乎可行:
proc createArr() {
var len = stdin.read(int);
if (len > 0) {
var X: [1..len] real;
return X;
} else {
var Y: [-1..1] real;
return Y;
}
}
var A = createArr();
writeln(A);
要了解为什么编译器无法解析示例中的 return 类型,可能需要有关您的过程主体/return 语句包含的内容的更多信息。
我在递归函数中时常遇到这种情况,在省略 return 类型失败的情况下;在这种情况下,我创建了一个 record
,它是一个具有域的数组,例如:
record stringarray {
var D: domain(1);
var strs : [D] string;
}
然后将递归数组定义为 return 这些记录之一:
proc repeats() : stringarray {
var reps: stringarray;
//...
for child in children do {
childreps = child.repeats();
for childrep in childreps do
reps.push_back(childrep);
}
//...
return reps;
}