6

我正在尝试返回对数组切片的引用,但出现以下编译时错误(违规行在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];

只是为了完整性:

chpl 版本 1.16.0 预发行版 (2659cc6)

4

1 回答 1

2

在您使用的编译器的当前版本中,这是一个悬而未决的问题,正在GitHub 问题 #5341上进行辩论。我同意你的观点,这ref似乎是表明返回数组切片的意图的合适方式,但我们尚未结束讨论。

同时,您应该能够使用以下基于 pragma 的解决方法(请注意,Chapel pragma 通常不适合最终用户使用,并且这种 pragma 不太可能在长期内得到支持,尽管我不会不希望我们在没有提出建议的替代方法的情况下将其淘汰ref):

record R {
  var A : [0.. #10] int;

  proc full() ref {
    return A;
  }

  pragma "no copy return"
  proc slice() {
    return A[0.. #5];
  }
}

var r : R;
ref x1 = r.full();
ref x2 = r.slice();
ref x3 = x1[0.. #5];
x1[0] = 1;
x2[1] = 2;
x3[2] = 3;
writeln(r);
于 2017-07-07T16:11:39.767 回答