如何复制数组?

时间:2009-07-13 12:42:03

标签: delphi arrays

我在Delphi中遇到这样一个基本问题,我无法解决它。

我的代码:

注意:DataR在下面的方法中是本地的,但通常它是一个类var.Just为它的本地概念。

class procedure TCelebrity.BeginRead(var input:Array of byte);
var DataR:Array of byte;
begin
  VirtualFree(@DataRead,High(DataRead),MEM_RELEASE);
  SetLength(DataR,Length(input));
  Move(input,DataR,Length(input));
end;

这是编译,但执行Move()后DataR = nil。

第二次尝试:

class procedure TCelebrity.BeginRead(var input:Array of byte);
var DataR:Array of byte;
begin
  VirtualFree(@DataRead,High(DataRead),MEM_RELEASE);
  SetLength(DataR,Length(input));
  DataR := Copy(input,0,Length(input));
end;

这根本不编译。第三行的错误(DataR:= Copy(输入....)说“不兼容的类型”。

问题出在哪里?它们都是字节数组!

4 个答案:

答案 0 :(得分:8)

试试这个

type
  TByteDynArray = array of Byte;

function CopyData(const Input:array of Byte):TByteDynArray;
begin
  SetLength(Result, Length(Input));
  Move(input[0], Result[0], Length(Input));
end;

答案 1 :(得分:7)

为什么不使用FOR?

SetLength(DataR,Length(input));
for i:=Low(input) to High(input) do
  DataR[i]:=input[i];

BTW:如果你想让数组作为参数传递,你应该将它们声明为一个类型,例如:

type
  TMyArray = array of byte;

并使用TMyArray作为参数类型。

编辑:我收到了关于价值较低的通知。在我的原始帖子中,它是针对i:= 0,但是i:=低(输入)更安全,更纯粹。

答案 2 :(得分:2)

尝试:

class procedure TCelebrity.BeginRead(var input:Array of byte);
var DataR:Array of byte;
begin
  VirtualFree(@DataRead,High(DataRead),MEM_RELEASE);
  SetLength(DataR,Length(input));
  Move(input[0],DataR,Length(input));
end;

答案 3 :(得分:1)

移动程序不会移动一段内存。它复制Count字节。因此,您将获得两个不同的相同数组:Input和DataR。

procedure CopyData(const Input: Array of Byte);
var 
    DataR: Array of Byte;
begin
    SetLength(DataR, Length(Input));
    Move(Input[0], DataR[0], SizeOf(Byte)*Length(Input));
end;

P.S。使用静态数组,您可以使用SizeOf(输入)而不是SizeOf(字节)*长度(输入)。 而不是字节可以是其他数据类型。