![]() |
Fehlersuche bei Listen
Hallo zusammen.
Habe folgendes Problem: Ich habe eine "filmothek" geschrieben, die ihre Daten in einer Textdatei speichert und auch Laden kann. Klappt alles. Nur wenn ich die Sache Ausgeben lassen will, habe ich ein Problem. Die Idee ist, dass ich es Ausgeben lassen und durch klicke auf ein OnClick der nächste Element angezeigt wird (Also der Zeiger ein Element weiter gesetzt wird). Die "showmessage " dienen nur zur überprüfung, ob der Zeiger wirklich weiter geht. Sobald ich nun die Elemente in ein Form ausgeben will (was bei der ersten ausgabe klappt!) kommt folgender Fehler: Im Projekt HauptprogrammProjekt.exe ist eine exception der klasse EAccessViolation aufgetreten. Meldung:'Zugriffsverletzung bei Adresse 0045BAB3 im modul 'HauptprogrammProjekt.exe'. Lesen von Adresse 00000004'. Prozess wurde angehalten. Mit einzelnen Anweisungen oder Start fortsetzen. Könnt ihr mir helfen den Fehler zu finden? Denn offenbar funktioniert es ja, den nächsten Datensatz anzuzeigen (über showmessage) aber nicht in das Formular zu geben. Anbei Quelltext. KOPF, TEMP sind Global!
Delphi-Quellcode:
PROCEDURE ausgabeListe(L:Listenzeiger);
BEGIN BEGIN showmessage(l^.genre); ausgabeformular.titelaus.Items.add(l^.Titel); ausgabeformular.genreaus.Items.add(l^.genre); ausgabeformular.jahraus.Items.add(l^.jahr); ausgabeformular.regiseuraus.Items.add(l^.Regisseur); ausgabeformular.schauspieleraus.Items.add(l^.schauspieler); IF (hilf AND (l<>NIL)) THEN BEGIN l:=l^.Next; ausgabeListe(l); f hilf:=false; END ELSE l:=NIL; END; END;
Delphi-Quellcode:
Ich hatte auch die Idee es in dem letzten "weiter click" schon weiterzusetzten (Auskommentiert Temp:=temp^.next)
procedure TAusgabeformular.WeiterClick(Sender: TObject);
begin titelaus.Clear; genreaus.Clear; jahraus.clear; regiseuraus.clear; schauspieleraus.clear; //WHILE Temp<>NIL DO BEGIN hilf:=TRUE; // temp:=temp^.Next; // showmessage(temp^.titel); ausgabeliste(temp); end; //end; end. Vielen Dank für eure Hilfe! |
Re: Fehlersuche bei Listen
Moin,
bin noch nicht ganz wach ..., wie ist denn Temp definiert/deklariert? In der Procedure ausgabeListe rufst du rekursiv ausgabeListe auf ! ? Ist so gewollt? Ich würde zwei Proceduren schreiben, eine zum "Zeigerbewegen" und eine zur Anzeige/Ausgabe. Kann oft übersichtlicher wirken ;-) MJ |
Re: Fehlersuche bei Listen
Delphi-Quellcode:
IF (hilf AND (l<>NIL)) THEN BEGIN l:=l^.Next; ausgabeListe(l); f hilf:=false; // dies hier wird erst dann aufgerufen wenn der Listenzeiger auf NIl steht END Warum rufst Du ausgabeListe rekursiv auf, wenn Du immer nur das nächste Element angezeigt bekommen willst. Mach Dir doch eine Prozedur AusgabeElement(pointer) der du den Zeiger übergibst. Das "weiterschalten" zum nächsten Element kannst Du dann im Weiterclick ausführen. Grüße Klaus |
Re: Fehlersuche bei Listen
Hatte mich unter nem Freund einglockt...also das da oben ist mein Problem ;)
Zunächst JA es war gewollt dies Rekursiv aufzurfen. Und TEMP ist im Hauptprogramm (nahezu zu beginn) deklariert als TEMP:=KOPF. Damit wollte ich verhindern, dass ich meinen Kopf klaue und dadurch meine ganze Liste verschwindet... Der andere Vorschlag habe ich ja in dem Auskommentierten Teil verwirklicht. Habe es da ausprobiert, wenn ich nicht rekursiv mache sondern NUR beim klicken auf WEITER der zeiger.next genommen wird. Aber das sind beides Feinheiten. Also das es gibt auch den selben Fehler wenn ich das ganze so gestalte:
Delphi-Quellcode:
und
PROCEDURE ausgabeListe(L:Listenzeiger);
BEGIN BEGIN showmessage(l^.genre); ausgabeformular.titelaus.Items.add(l^.Titel); ausgabeformular.genreaus.Items.add(l^.genre); ausgabeformular.jahraus.Items.add(l^.jahr); ausgabeformular.regiseuraus.Items.add(l^.Regisseur); ausgabeformular.schauspieleraus.Items.add(l^.schauspieler); END; END;
Delphi-Quellcode:
Mein Problem ist der EAccessViolation Fehler. Und dieser tritt leider bei beiden auf... :(
procedure TAusgabeformular.WeiterClick(Sender: TObject);
begin titelaus.Clear; genreaus.Clear; jahraus.clear; regiseuraus.clear; schauspieleraus.clear; temp:=temp^.Next; ausgabeliste(temp); end; end. |
Re: Fehlersuche bei Listen
Ist das eine Hausaufgabe für Pascal?
Deine Vorgehensweise ist veraltet und stammt aus der Zeit als man verkettete Listen selbst programmiert hat und Objektorientierung noch ein Fremdwort war. Heutzutage verwendet man einfach TList oder TObjectList und vermeidet man Zeiger wann immer möglich. |
Re: Fehlersuche bei Listen
Produzierst Du auch so noch den Fehler?
Grüße Klaus
Delphi-Quellcode:
procedure TAusgabeformular.WeiterClick(Sender: TObject);
begin titelaus.Clear; genreaus.Clear; jahraus.clear; regiseuraus.clear; schauspieleraus.clear; if temp <> nil then begin temp:=temp^.Next; ausgabeliste(temp); end; end; end. |
Re: Fehlersuche bei Listen
Vielen Dank Klaus! Der Fehler kommt nicht mehr (soweit ich das bis jetzt testen konnte...) Leider funktioniert es immer noch nicht wieder wie vorher (weil ich zu meine schande gestehen muss, dass ich es bereits hinbekommen hatte, dann die suchfunktion implementiert hab und danach gings nicht mehr ;) )
Achso und...Leider ist es ein Schulprojekt...und unser lehrer besteht auf die veraltete vorgehensweise...Delphi 2005 oder 2006 würde auch die Fehlersuche sowei ich weiß deutlich vereinfachen ;) Gruß Tasta |
Re: Fehlersuche bei Listen
Schade...leider taucht der Fehler doch noch immer auf...immer noch AccessViolation...wenn es hilft: Der gleiche Fehler kommt wenn ich etwas versuche auszugeben, die Liste aber leer ist!
|
Re: Fehlersuche bei Listen
Initialisierst Du die Pointer.
Ist die Liste leer ist temp dann nil? Wird bei dem ersten Listenelement ^.next auf nil gesetzt? Beim zweiten Listenelement der ^.next des ersten Elementes auf die Adresse des zweiten Elemetes gesetzt und der ^.next des zweiten Elementes auf nil geseztz? Grüße Klaus |
Re: Fehlersuche bei Listen
Also eigentlich kann es daran nicht liegen, da ich den "inhalt" der liste durch "laden" aus einer textdatei bekomme und definitiv weiß das mindestens 4 elemente in der textdatei stehen. Habe die Datei folgendermaßen abgeändert und nun funktioniert es für ein weiteres Element:
Delphi-Quellcode:
procedure TAusgabeformular.WeiterClick(Sender: TObject);
begin titelaus.Clear; genreaus.Clear; jahraus.clear; regiseuraus.clear; schauspieleraus.clear; if temp.next<> nil then begin temp:=temp^.Next; ausgabeliste(temp); end; end; end.
Delphi-Quellcode:
Wenn ich nun nicht if temp.next<>NiL mache, sagt er mir beim dritten klick auf WEITER den bekannten Fehler und markiert die Zeile "ausgabeformular.titelaus.Items.add(l^.titel). Bei temp.next<>NIL macht er zwar auch nur 2x weiter (es wird nur zweimal was ausgegeben) und danach passiert gar nichts mehr (obwohl noch was in der liste sein sollte) aber wenigstens stürtzt das Programm nicht ab.
PROCEDURE ausgabeListe(L:Listenzeiger);
BEGIN ausgabeformular.titelaus.Items.add(l^.Titel); ausgabeformular.genreaus.Items.add(l^.genre); ausgabeformular.jahraus.Items.add(l^.jahr); ausgabeformular.regiseuraus.Items.add(l^.Regisseur); ausgabeformular.schauspieleraus.Items.add(l^.schauspieler); END; Gruß Tasta |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz