Chcę utworzyć grupę rekordów (RWell) i przechowywać je w tablicy w określonej kolejności. Następnie chcę utworzyć nową tablicę (inny układ) i zamienić w nią rekordy. Oczywiście nie chcę duplikować danych w pamięci RAM, więc w drugiej tablicy powinienem umieścić wskaźniki do rekordów w pierwszej tablicy. Jednak nie mogę tego zrobić. Ktoś może powiedzieć, co jest nie tak z poniższym kodem? DziękiTablica (wskaźniki do rekordu)
Type
RWell= record
x: string;
i: integer;
end;
PWell= ^RWell;
RWellArray= Array[0..12, 0..8] of RWell;
procedure TClass1.CreateWells
var
WellMX: RWellArray;
begin
{ should I initialize the WellXM here? }
{ note: WellXM is a static array! }
other stuff
end;
var Wells: array of PWell;
procedure TClass2.AddWell(aWell: RWell);
begin
aWell.Stuff:= stuff; {aWell cannot be readonly because I need to change it here}
SetLength(Wells, Length(Wells)+ 1); { reserve memory }
Wells[High(Wells)]:= @aWell;
end;
procedure TClass3.DisplayWell;
var CurWell: RWell;
begin
CurWell:= CurPrimer.Wells[iCurWell]^; <--- AV here (but in debugger the address is correct)
end;
rozwiązany przez Rob K.
Otrzymasz komentarze na temat swojej techniki dołączania do końca tablicy dynamicznej. Może być nieefektywna i może dzielić pamięć. Lepiej przygotuj tablicę, której potrzebujesz, tylko raz, a następnie przypisz wartości do następnego nieprzypisanego elementu. Inną opcją jest użycie 'TList', który jest bardzo dobry w przechowywaniu wskaźników. Począwszy od Delphi 2009, może być nawet bezpieczny dla typów jako "TList". –
Nie wiem, rozmiar tej tablicy w czasie wykonywania. I wiem, że to nie jest optymalne. Ustawiłem jego długość. Ale jest bardzo mały (poniżej 600 wpisów), więc fragmentacja będzie niewielka. Nie będę tego zmieniać teraz. Dzięki za sugestię :) – Ampere
Zgodziłbym się, że lepiej jest użyć listy tutaj. –