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)
它似乎是函数复制指针而不是值.
动态数组是引用类型.在幕后,它们被实现为数据结构的指针.分配动态数组变量时,您只需对现有的动态数组对象进行另一次引用.所以,这解释了你观察到的行为.
有一个函数可用于制作动态数组的副本,名称恰当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>尽可能使用将导致更多可组合的代码.
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |