如何在Chapel中指定未知大小的数组的返回



我尝试对带有签名的函数依赖类型推断: proc mode(data: [?]int) 但编译器说它无法解决返回类型(这是一个警告本身,我猜只有两个返回语句)。我试着: proc mode(data: [?]int): [?]int 但是编译器说有一个内部错误: internal error: CAL0057 chpl Version 1.13.1.518d486 指定函数返回的数组长度只能在运行时知道的正确方法是什么?

如果返回的数组的域/大小不能在函数原型中直接描述,我认为目前最好的办法是省略任何返回类型的描述,并依靠Chapel的类型推断机制来确定您正在返回一个数组(正如您尝试的那样)。例如,下面是一个过程,它读入一个先前未知大小的数组并返回它:

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

你的问题提到了多个返回语句,这就打开了一个关于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);

要理解为什么编译器不能解析示例中的返回类型,可能需要更多关于过程体/返回语句所包含内容的信息。

我在递归函数中经常遇到这种情况,在省略返回类型失败的情况下;在本例中,我创建了一个record,它是一个具有域的数组,例如:

record stringarray {
  var D: domain(1);
  var strs : [D] string;
}

,然后定义递归数组返回其中一条记录:

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;
}

相关内容

  • 没有找到相关文章

最新更新