有没有办法将整个数组复制到另一个数组?(除了使用For循环)

Dia*_*ian 10 delphi

有没有办法将整个数组复制到另一个数组?除了使用for循环.

移动复制命令是否适用于此?我确实尝试了,但它有一个错误:"不兼容的类型".

我应该坚持使用for-loop吗?

Vik*_*vub 20

为了安全起见,请Copy在动态数组上使用该函数,因为它在内部处理托管类型.数组必须是相同的类型,即在同一个表达式中声明:

var  
    a, b: array of string;
Run Code Online (Sandbox Code Playgroud)

或者通过定义自定义数组类型:

type   
    TStringArray = array of string;  
var 
    a: TStringArray;  
//...and somewhere else
var  
    b: TStringArray;  
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

a := Copy(b, Low(b), Length(b));  //really clean, but unnecessary 
//...or   
a := Copy(b, 0, MaxInt);  //dynamic arrays always have zero low bound 
                          //and Copy copies only "up to" Count items  
Run Code Online (Sandbox Code Playgroud)

你必须在静态数组上使用循环,并且在混合数组类型时(不是我建议这样做).
如果你真的必须使用Move,请记住检查零长度,因为A[0]构造可以引发范围检查错误(有明显的例外SizeOf(A[0]),由编译器魔法处理,从不实际执行).
永远不要假设,A = A[0]或者SizeOf(A) = Length(A) * SizeOf(A[0]),因为这只适用于静态数组,如果你以后尝试将巨大的代码库重构为动态数组,它将会非常糟糕.

  • 虽然使用硬编码的上限和下限(如0和`MaxInt`)很方便,但完全省略边界更方便:`a:= Copy(b)`.这会复制整个阵列. (9认同)

小智 6

对于动态数组:

var A,B: array of Byte;

begin
  SetLength(A, <size>);
  //initialize A

  B:= A; 
  SetLength(B,Length(A));

end;
Run Code Online (Sandbox Code Playgroud)

在动态数组中,赋值语句仅复制对数组的引用,而SetLength执行物理复制/复制它的工作,留下两个独立的独立动态数组.


ale*_*lex 5

请参阅有关 delphibasics.co.uk 的文章

您可以使用 Copy 方法复制数组(传入 0 作为索引和 Length(Source) 作为计数以复制完整内容)。

不要对字符串/数组/接口/等托管类型的数组使用 Move 或 CopyMemory。这样做将绕过 Delphi 的引用计数机制,并会导致内存泄漏和数据损坏。