我有多维数组:
TBMArray = TArray<array of byte>;
和递归函数
function goForSolve(bData: TBMArray; const iSize: integer): TBMArray;
在这个功能我有
tempData: TBMArray;
我需要更改tempData而不更改bData的值。但是当我改变tempData时,bData也会改变。我试图通过函数
procedure copyData(Source: TBMArray; var Dest: TBMArray);
var
iCurEl, iLen: integer;
begin
iLen := length(Source);
setLength(Dest, iLen);
setLength(Dest[0], 1);
for iCurEl := 1 to iLen - 1 do
setLength(Dest[iCurEl], iCurEl + 1);
for iCurEl := Low(Source) to High(Source) do
Dest[iCurEl] := Source[iCurEl];
end;
但结果与
相同tempData := bData;
它似乎是函数复制指针而不是值。
答案 0 :(得分:6)
动态数组是引用类型。在幕后,它们被实现为数据结构的指针。分配动态数组变量时,您只需对现有的动态数组对象进行另一次引用。所以,这解释了你观察到的行为。
有一个函数可用于制作动态数组的副本,名为Copy
。所以你可以写:
Dest := Copy(Source);
这将生成外部数组的副本,但不会生成内部数组。因此,您需要自己迭代外部数组,并调用Copy
来创建内部数组的新副本。也许是这样的:
type
TBMArray = TArray<TArray<Byte>>;
function CopyBMArray(const src: TBMArray): TBMArray;
var
i: Integer;
begin
SetLength(Result, Length(src));
for i := 0 to high(Result) do begin
Result[i] := Copy(src[i]);
end;
end;
请注意,我已经调整了TBMArray
的定义。我敦促你这样做,因为它会大大简化你的发展。通用类型具有更宽松的类型兼容性规则,并且尽可能使用TArray<T>
将导致更多可组合的代码。