如何复制数组以便我可以从Chapel中的副本中删除元素?

时间:2018-03-19 16:20:47

标签: chapel

我正在使用数组的副本,以便我可以修改它。样品是

var x:[1..4] int = [1,2,3,4];
writeln(x);
x.remove(3);
writeln(x);

var y = x;
writeln(y);
y.remove(2);
writeln(y);

然而,最后一行给了我

error: halt reached - cannot call remove on an array defined over a domain with multiple arrays

那么复制和允许编辑的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

当你说:

var y = x;

您正在获取其域名(索引集)与y相同的新阵列x。也就是说,这个声明类似于说:

var D = {1..4};      // create a domain
var x, y: [D] int;   // create two arrays that share that domain

正如错误消息所示,Chapel不允许直接调整与另一个数组共享其域的数组的大小,因为如果这样做,从y中删除元素也会导致该元素从{{{ 1}}我们认为这将是非常微妙和令人惊讶的支持。

因此,为了创建可修改的x副本,您需要以赋予其各自域名的方式声明x。为您的特定程序执行此操作的最简单方法如下:

y

你也可以更灵活地写出来:

var y: [1..3] int = x;

甚至:

var y: [1..x.size] int = x;

由于这些声明中的每一个都会导致var y: [1..x.size] x.eltType = x; 获得自己的唯一域,因此可以独立于y进行修改。

相关问题