如何复制数组以便从 Chapel 中的副本中删除元素?
How do I copy an array so I can remove elements from the copy in 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
那么复制和允许编辑的正确方法是什么?
当你说:
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
中删除元素也会导致从中删除该元素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
获得自己独特的域,因此可以独立于 x
对其进行修改。
我正在处理一个数组的副本,因此我可以对其进行修改。样本是
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
那么复制和允许编辑的正确方法是什么?
当你说:
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
中删除元素也会导致从中删除该元素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
获得自己独特的域,因此可以独立于 x
对其进行修改。