У меня есть цикл, который обновляет значения в одномерном массиве (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;
Изначально у меня не было вызова setlength в начале цикла for, и в этом случае соответствующее количество элементов добавлялось к resultPnts, но все они были одинаковыми (как если бы логика присваивания Arr2.Pnts [0] и Arr2.Pnts[1] не вызывались в каждой итерации цикла)
Я исправил проблему, добавив вызов setlength, но я действительно не понимаю, зачем это нужно. Я хотел бы понять, что здесь происходит, чтобы избежать подобных проблем в будущем.
Кто-нибудь может объяснить мне, почему код не работает должным образом без setlength в цикле?
Я считаю, что проблема может заключаться в
Arr2.Pnts[0] := Arr1.Pnts[j];
, с помощью которого вы всегда меняете значение первой точки вашегоArr2.Pnts
. Но позже в вашемAddPnt (Arr1.Pnts[j], slbthick, Arr2.Pnts[1]);
вы проверяете значение второй точки вашегоArr2.Pnts
.