Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何复制阵列?_Delphi_Arrays - Fatal编程技术网

Delphi 如何复制阵列?

Delphi 如何复制阵列?,delphi,arrays,Delphi,Arrays,我在Delphi中遇到了这样一个基本的问题,我无法解决它 我的代码: 注意:在下面的方法中,DataR是局部的,但通常它是一个类变量。就概念而言,它是局部的 class procedure TCelebrity.BeginRead(var input:Array of byte); var DataR:Array of byte; begin VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); SetLength(DataR,Length

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

我的代码:

注意:在下面的方法中,DataR是局部的,但通常它是一个类变量。就概念而言,它是局部的

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(input…)出现错误,表示“不兼容的类型”

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

为什么不用于

SetLength(DataR,Length(input));
for i:=Low(input) to High(input) do
  DataR[i]:=input[i];
顺便说一句:如果您想让数组作为参数传递,您应该将它们声明为一个类型,例如:

type
  TMyArray = array of byte;
并使用TMyArray作为类型参数

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

试试:

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;
试试这个

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;

移动过程不会移动一段内存。它复制计数字节。因此,您将得到两个不同的相同数组: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;
另外,对于静态数组,您可以使用SizeOf(输入)而不是SizeOf(字节)*长度(输入)。
而不是Byte可以是其他数据类型。

我有一个问题。VirtualFree总是返回false,那么如何释放当前与DataR一起使用的mem?注意DataR不是本地的,而是原始代码中的类var。提前感谢您的回答!不,您没有免费的简单数组。这样的数组会自动释放(例如,当您的类被销毁时)。注意:如果您有一个对象引用数组,则必须手动释放这些对象,因为Delphi只会释放数组。另外请注意,SetLength会重新分配整个数组,因此请避免密集使用此过程。当使用SetLength使数组变长时,当前内容保持不变,但是,当您将其设置为sh时orter,一些内容将丢失。作为对“为什么不用于?”的回答。我唯一的原因是,如果存在真正的性能问题。如果您多次这样做,那么移动速度会更快。使用Move()它类似于memcpy()/memmove()在C语言中,永远不要使用FOR来复制数组一个正确的答案。但是为了让它成为一个好的答案,你应该解释为什么你的更改非常重要。否则,这只是一个神奇的咒语。如果我错了,请纠正我,但可能值得注意的是,这只适用于
字节数组
。如果数组有任何不同,请说
数组对于整数
,那么你需要
移动(输入[0],结果[0],长度(输入)*SizeOf(整数))
。只需说一下。@Rob Kennedy:Move()在delphi中类似于memcpy()/memmove(),你知道,@Dns。那又怎样?为什么不使用SizeOf(输入[0])而不是硬编码的数据类型呢?
VirtualFree()
调用似乎有点多余。可能重复