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

时间:2016-09-08 09:49:47

标签: function return-type chapel

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

2 个答案:

答案 0 :(得分:4)

如果返回的数组的域/大小无法直接在函数原型中描述,我相信您目前最好的选择是省略返回类型的任何描述,并依靠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

你的问题提到了多个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);

要理解为什么编译器无法解析示例中的返回类型,可能需要有关您的过程正文/返回语句包含的内容的更多信息。

答案 1 :(得分:0)

在不考虑返回类型失败的情况下,我经常在递归函数中遇到这种情况。在这种情况下,我创建了一个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;
}