2

我有多维数组:
TBMArray = TArray<array of byte>;
和递归函数
function goForSolve(bData: TBMArray; const iSize: integer): TBMArray;

在这个函数中,
tempData: TBMArray;
我需要在不更改 bData 值的情况下更改 tempData。但是当我改变 tempData 时,bData 也会改变。我试图通过函数将 bData 复制到 tempData

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;

看起来像函数复制指针而不是值。

4

1 回答 1

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>尽可能使用将导致更可组合的代码。

于 2013-09-21T18:34:58.417 回答