Siema, moje pytanie jest potraktowane w pewnym sensie lenistwem i brakiem czasu, bo wiem, że sam se to mogę sprawdzić, więc jeśli mnie wyzwiecie, to przeżyję. Ale może ktoś na szybko będzie w stanie odpowiedzieć. ;) Przy okazji będzie coś dla potomnych.
Załóżmy, że mamy rekord, w skład którego wchodzą tablice dynamiczne i inne rekordy. Np:
TRec = record
arr: array of integer;
arr2: array of string;
subRec: TSubRecord;
end;
Teraz mamy dwie zmiennego tego typu, które chcemy przyrównać. I tu się zaczyna moje pytanie. Czy przyrównanie:
rec1:=rec2
jest bezpieczne?
Załóżmy, że rec1 występuje w parametrze funkcji (jako var), a rec2 jest zmienną lokalną tejże funkcji. Wg mnie rec1 będzie wskazywał na rec2(ewentualnie elementy rec1 będą wskazywać na elementy rec2) i po wyjściu z funkcji wszystko może szlag trafić. Gdyby rekordy składały się tylko z typów prostych, wszystko byłoby w porządku i można byłoby to zrobić. Dobrze rozumuję?
Tak więc, jeśli mam rację, to czy jedynym bezpiecznym sposobem jest przyrównywanie wszystkiego po kolei?
//pomijam sprawdzenie, czy tablice są puste
setLength(rec1.arr, length(rec2.arr));
copyMemory(@rec1.arr[0], @rec2.arr[0], length(rec2.arr));
setLength(rec1.arr2, length(rec2.arr2));
copyMemory(@rec1.arr2[0], @rec2.arr2[0], length(rec2.arr2));
rec1.subRec....... //itd
oczywiście, mogę skorzystać z dobrodziejstw nowoczesności i wyposażyć swój rekord w metodę Assign.
Czy nie ma jednak innej możliwości? Czy można w jakiś sprytny sposób skopiować cały rekord? Bo z tego, co widziałem, to rekordy z takimi polami(które nie są typami prostymi) nie są strukturami ciągłymi.
Jeśli sprawy wyglądają różnie w różnych środowiskach, z chęcią poznam te różnice.