Witam, mam problem, a nie znalazlem odpowiedzi...
Robie baze danych w Pascalu na zaliczenie. Są to trzy listy: lista klientow, lista kaset w wypozyczalni, oraz trzecia lista, ktora podczepiana jest do listy klientow i zawiera dane o wypozyczeniu oraz ewentualny wskaznik na kolejny element tej listy. Deklaracja wyglada tak:
type
wskaznik_klienta=^klient;
wskaznik_filmu=^film;
wskaznik_listy=^lista;
klient=record
ID:integer;
Nazwisko:string [50];
Imie:string [30];
Pesel:string [20];
Ulica:string [50];
NrDomu:string [10];
NrMieszkania:string [10];
KodPocztowy:string [6];
Miasto:string [50];
next:wskaznik_klienta;
prev:wskaznik_klienta;
wypozyczono:wskaznik_listy;
end;
lista=record
klient:wskaznik_klienta;
ID_klienta:integer;
wypozyczyl:wskaznik_filmu;
ID_filmu:integer;
data_wyp:array [1..3] of Word; {rotmat dd-mm-rrrr}
next:wskaznik_listy;
prev:wskaznik_listy;
end;
film=record
ID:integer;
Tytul:string [50];
Rezyser:string [80];
Aktor1:string [80];
Aktor2:string [80];
Wytwornia:string [50];
RokProdukcji:string [10];
Ilosc_Egz:byte;
next:wskaznik_filmu;
prev:wskaznik_filmu;
end;
Dane na temat wypozyczen przechowywane sa w pliku textowym w postaci
ID_klienta;ID_Filmu;dzien;mies;rok
i teraz mam problem. Jak wczytuje wypozyczenia, wskaznik na podliste z wypozyczeniem podpinam do klient^.wypozyczono i ustawiam wartosc next na nil`a. Ale w momencie wczytywania ten nil sie traci i program sie zapęla... Ciagle jako next wskazuje na siebie :/ i kurde nie widze gdzie jest tutaj blad... Procedura wyglada tak:
Procedure Wczytaj_wyp (glowa_klienta:wskaznik_klienta; glowa_filmu:wskaznik_filmu);
var
tymczas: array [1..5] of string;
wiersz: string;
KlientID: integer;
FilmID: integer;
dzien,miesiac,rok:integer;
dlugosc_wiersza:byte;
wyraz,i:byte;
blad:integer;
przech_kl,pomK: wskaznik_klienta;
przech_fi,pomF: wskaznik_filmu;
przech_li,pomL: wskaznik_listy;
rezultat:boolean;
znak:char;
Begin
assign (wypozyczenia, 'wypozycz.txt');
reset (wypozyczenia);
przech_fi:=nil;
przech_kl:=nil;
wyraz:=1;
while (not eof (wypozyczenia)) do
begin
readln (wypozyczenia, wiersz);
dlugosc_wiersza:=length(wiersz);
for i:=1 to 5 do tymczas[i]:=''; {zeruje tablice}
for i:=1 to dlugosc_wiersza do
begin
znak:=wiersz[i];
if znak<>';' then
tymczas[wyraz]:=tymczas[wyraz]+znak
else {uzupelnia tablice kolejnymi danymi klientow}
inc(wyraz,1);
end;
for i:=length(tymczas[1]) downto 1 do val(tymczas[1],KlientID,blad);
for i:=length(tymczas[2]) downto 1 do val(tymczas[2],filmID,blad);
for i:=length(tymczas[3]) downto 1 do val(tymczas[3],dzien,blad);
for i:=length(tymczas[4]) downto 1 do val(tymczas[4],miesiac,blad);
for i:=length(tymczas[5]) downto 1 do val(tymczas[5],rok,blad);
{wyszukiwanie filmu}
if glowa_filmu=nil then
begin
write ('brak bazy filmow, program nie moze wczytac danych.'); delay (1000);
exit;
end
else
begin
pomF:=glowa_filmu;
for j:=1 to (licznik_filmow-1) do
begin
rezultat:=false;
if pomF^.ID=FilmID then
begin
rezultat:=true;
przech_fi:=pomF;
pomF:=pomF^.next;
end
else
pomF:=pomF^.next;
end;
if przech_fi=nil then
begin
write ('BLAD! Nie zgadzaja sie dane w bazie filmow!'); delay (1000);
exit;
end;
end;
{wyszukiwanie klienta}
if glowa_klienta=nil then
begin
write ('brak bazy filmow, program nie moze wczytac danych.'); delay (1000);
exit;
end
else
begin
pomK:=glowa_klienta;
for j:=1 to (licznik_klientow-1) do
begin
rezultat:=false;
if pomK^.ID=klientID then
begin
rezultat:=true;
przech_kl:=pomK;
pomK:=pomK^.next;
if przech_kl^.wypozyczono=nil then
begin
new (przech_li);
przech_li^.klient:=przech_kl;
przech_li^.ID_klienta:=przech_kl^.ID;
przech_li^.wypozyczyl:=przech_fi;
przech_li^.ID_filmu:=przech_fi^.ID;
przech_li^.Data_wyp[1]:=dzien;
przech_li^.Data_wyp[2]:=miesiac;
przech_li^.Data_wyp[3]:=rok;
przech_li^.prev:=nil;
przech_li^.next:=nil;
przech_kl^.wypozyczono:=przech_li;
end
else
begin
pomL:=przech_kl^.wypozyczono;
repeat
begin
pomL:=pomL^.next;
end; {TU SIE ZAPĘTLA!!!!}
until pomL^.next=nil;
new (przech_li);
przech_li^.klient:=przech_kl;
przech_li^.ID_klienta:=przech_kl^.ID;
przech_li^.wypozyczyl:=przech_fi;
przech_li^.ID_filmu:=przech_fi^.ID;
przech_li^.Data_wyp[1]:=dzien;
przech_li^.Data_wyp[2]:=miesiac;
przech_li^.Data_wyp[3]:=rok;
przech_li^.prev:=pomL;
przech_li^.next:=nil;
pomL^.next:=przech_li;
end;
end
else
pomK:=pomK^.next;
end;
if przech_kl=nil then
begin
write ('Blad odczytu danych, wczytywanie przerwano.'); delay (1000);
exit;
end;
end;
end;
End;
Bede wdzieczny za kazda pomoc...