德尔福。多维数组作为参数

时间:2013-09-21 18:18:30

标签: arrays delphi multidimensional-array

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

在这个功能我有 tempData: TBMArray;
我需要更改tempData而不更改bData的值。但是当我改变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;

它似乎是函数复制指针而不是值。

1 个答案:

答案 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>将导致更多可组合的代码。