我正在使用数组的副本,以便我可以修改它。样品是
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
那么复制和允许编辑的正确方法是什么?
答案 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
进行修改。