Delphi 如何复制阵列?
我在Delphi中遇到了这样一个基本的问题,我无法解决它 我的代码: 注意:在下面的方法中,DataR是局部的,但通常它是一个类变量。就概念而言,它是局部的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
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()
调用似乎有点多余。可能重复