Cześć,
pojawił mi się ostatnio dość dziwny problem.
Mam tablice przechowujaca dane w postaci rekordow. Stworzylem procedure, ktora paruje jej elementy na podstawie jakis zasad. Przekazuje do procedury tymczasowa tablice stworzona na postawie tej wlasciwej zeby mogla swobodnie na niej operowa, usuwac elementy itp.
Problem w tym, ze w momencie usuwania elementow tej tymczasowej, modyfikaja sie tez wartosci w tej glownej. Pierwotnie operowalem na wskaznikach ale myslalem, ze moze gdzies cos zle przekazalem. Zmodyfikowalem wszystko i problem dalej wystepuje.
Mianowicie:
mam typy:
TRekord=record
id:string;
end;
TTablica=array of TRekord
Stworzyłem procedurę, która paruje elementy tablicy po jakiś danych, które są jeszcze w elementach TRekord. Wygląda ona tak:
procedure SparujElementy(tab:TTablica);
var
tmpA,tmpB:string;
begin
if Length(tab)=0 then
Exit;
{cos tam wykonuje, licze, dodaje, odejmuje i po sparowaniu pozycji usuwam je z tymczasowej tablicy zeby nie bylu juz brane pod uwage, pary zapisywane sa do bazy i wszystko smiga}
tmpA:=tab[0].id; //pierwszy parowany
tmpB:=tab[i].id; //drugi parowany
tab:=UsunElementTablicy(tmpA, tab);
tab:=UsunElementTablicy(tmpB, tab);
SparujElementy(tab);
Exit;
end;
Tu jest jeszcze wszystko ok, przy debugowaniu znalazlem, ze problem pojawia sie w funkcji UsunElementTablicy:
function UsunElementTablicy(id:string; tablica:TTablica):TTablica;
var
i,j:integer;
begin
//szukamy pozycji elementu o danym id
for j:=0 to Length(tablica)-1 do
begin
if tablica[j].id=id then
begin
Break;
end;
end;
//wywalamy
for i:=j to High(tablica)-1 do
tablica[i]:= tablica[i+1];
SetLength(tablica, High(tablica));
Result:=tablica;
end;
Wszystko to wywolywane jest w ten sposob:
//TablicaElementow to wlasciwa tablica
tmpTablicaElementow:=TablicaElementow;
SparujElementy(tmpTablicaElementow);
Problem pojawia sie dokladnie w tym miejscu przy usuwaniu elementow w funkcji UsunElementyTablicy
tablica[i]:= tablica[i+1]; //TUTAJ
Elementy tablicy tymczasowej sa poprawnie przesuwane a rozmiar tablicy zmniejszany ale modyfikuja sie wartosci tez w tej glownej (TablicaElementow) - sa rowniez przesuwane!!
Jezeli sparuje elementy 2 razy od poczatku w petli to majac na poczatku TablicaElementow:
[0].id=5;
[1].id=6;
[2].id=7;
[3].id=8;
to po tej operacji dostaje jakies dziwne, gdzie nie powinny byc w ogole ruszone.
[0].id=5;
[1].id=8;
[2].id=8;
[3].id=8;
Prosze o pomoc bo juz nie mam pojecia co zle robie. Moze ktos zaproponuje lepsze rozwiazanie takiej sytuacji, bardziej optymalne skoro tutaj popelnilem gdzies blad?