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

Ale*_*ide 2 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;  
Run Code Online (Sandbox Code Playgroud)

但结果是一样的

tempData := bData;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 6

动态数组是引用类型.在幕后,它们被实现为数据结构的指针.分配动态数组变量时,您只需对现有的动态数组对象进行另一次引用.所以,这解释了你观察到的行为.

有一个函数可用于制作动态数组的副本,名称恰当Copy.所以你可以写:

Dest := Copy(Source);
Run Code Online (Sandbox Code Playgroud)

这将生成外部数组的副本,但不会生成内部数组.因此,您需要自己迭代外部数组,并调用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;
Run Code Online (Sandbox Code Playgroud)

请注意,我已经调整了定义TBMArray.我敦促你这样做,因为它会大大简化你的发展.通用类型具有更宽松的类型兼容性规则,并且TArray<T>尽可能使用将导致更多可组合的代码.