我有一个循环更新一维数组(Arr2)中的值,然后将数组添加到列表(ResultPnts):
type
point = packed record
case aSInt of
0: (x, y, z: aFloat);
1: (v: array [0 .. 2] of aFloat); { vertex }
end;
MyPntArr = array of point;
EntPntArr = record
enttyp : byte;
zb, zh : double; // store zbase and zheight for 2d lines/arcs
closed : boolean; // set true if first and last points of lines/arcs are equal
Pnts : MyPntArr;
end;
tPaths = TList<EntPntArr>;
procedure PathEntToPntArr (ent : entity; var resultPnts : tPaths);
var
Arr1, Arr2 : EntPntArr;
j : integer;
begin
...
setlength (Arr2.Pnts, 2);
Arr2.closed := false;
Arr2.enttyp := entslb;
for j := 0 to length(Arr1.Pnts)-1-ord(Arr1.closed) do begin
setlength (Arr2.Pnts, 2); // note: I'm not entirely sure why, but without setting length in
// each iteration of the loop, the array points are not updated
// in each subsequent iteration after the first.
Arr2.Pnts[0] := Arr1.Pnts[j];
// add slbthick to Arr1.Pnts[j], with result in the var parameter Arr2.Pnts[1]
AddPnt (Arr1.Pnts[j], slbthick, Arr2.Pnts[1]);
resultPnts.Add(Arr2);
end;
最初我在 for 循环开始时没有调用 setlength,在这种情况下,适当数量的项目被添加到 resultPnts,但它们都是相同的(就像分配给 Arr2.Pnts[0] 的逻辑一样并且 Arr2.Pnts[1] 在循环的每次迭代中都没有被调用)
我已经通过添加 setlength 调用解决了这个问题,但我真的不明白为什么这是必要的。我很想了解这里发生了什么,以便将来可以更可靠地避免此类问题。
谁能向我解释为什么没有循环中的 setlength 代码不能按预期工作?