Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlersuche bei Listen (https://www.delphipraxis.net/81980-fehlersuche-bei-listen.html)

Muetze1 6. Dez 2006 16:51

Re: Fehlersuche bei Listen
 
Kannst du dir sicher sein, dass AusgabeListe() niemals einen NIL Zeiger bekommt? Also wenn z.B. die Liste leer ist? Weil wenn dies nicht 100%ig gewährleistet ist, dann folgendes:

Delphi-Quellcode:
PROCEDURE ausgabeListe(L:Listenzeiger);
BEGIN
  If l <> Nil Then
  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;
END;
Weil sonst l^.Titel schon eine AV schmeissen würde.

Klaus01 6. Dez 2006 18:30

Re: Fehlersuche bei Listen
 
Zeige uns doch einmal die Einleseroutine, bitte.

Grüße
Klaus

Tastaturkürzel 6. Dez 2006 19:32

Re: Fehlersuche bei Listen
 
Zwischendurch schonmal ein großes DANKE für eure Hilfe;)
hier kommt der Code:

Delphi-Quellcode:
PROCEDURE listeLaden(L:Listenzeiger);
var a,b,c,d,e:STRING;
    k,anz:INTEGER;
begin
  assignfile(test,'test.txt');
  reset(test);
  anz:=filesize(test);
FOR k:=0 TO (ANZ) DO
    BEGIN
      readln(test,a);
      readln(test,b);
      readln(test,c);
      readln(test,d);
      readln(test,e);
      FuegeHintenAn(a,b,c,d,e,l);
    END;
  closefile(test);
  kopf:=l;

  {ausgabeformular.TitelAUS.Items.Add(a);
  ausgabeformular.GenreAUS.Items.Add(b);
  ausgabeformular.JahrAUS.Items.Add(c);
  ausgabeformular.RegiseurAUS.Items.Add(d);
  ausgabeformular.SchauspielerAUS.Items.Add(e);}
end;
da fuegehintean benutzt wird, auch diese:
Delphi-Quellcode:
PROCEDURE FuegeHintenAn (Titel,Genre,Regisseur,Jahr,Schauspieler:STRING; VAR L : ListenZeiger);
VAR p,lauf : ListenZeiger;
BEGIN
     NEW(p);
     p^.Titel:=Titel;
     p^.Genre:=Genre;
     p^.Regisseur:=Regisseur;
     p^.Jahr:=Jahr;
     p^.Schauspieler:=Schauspieler;
     p^.Next:=NIL;
     IF IstListeLeer(L) THEN L:=p
     ELSE
     BEGIN
          lauf:=L;
          WHILE lauf^.Next<>NIl DO lauf:=lauf^.Next;
          lauf^.Next:=p
     END
END;

Klaus01 6. Dez 2006 21:17

Re: Fehlersuche bei Listen
 
Delphi-Quellcode:
PROCEDURE FuegeHintenAn (Titel,Genre,Regisseur,Jahr,Schauspieler:STRING; VAR kopf,L : ListenZeiger);
VAR
  p : ListenZeiger;
BEGIN
  NEW(p);
  p^.Titel:=Titel;
  p^.Genre:=Genre;
  p^.Regisseur:=Regisseur;
  p^.Jahr:=Jahr;
  p^.Schauspieler:=Schauspieler;
  p^.Next:=NIL;

  IF Not IstListeLeer(L) THEN
    L^.next:=p;   // Vorgängerelement^.next bekommt die Adresse des neuen Listenelementes
  else
    kopf:=p;      // erstes Element in der Liste

  L:=p; // Listenzeiger zeigt auf das neue Listenelement

END;
Delphi-Quellcode:
PROCEDURE listeLaden(L:Listenzeiger);
var a,b,c,d,e:STRING;
    k,anz:INTEGER;
begin
  assignfile(test,'test.txt');
  reset(test);
  anz:=filesize(test);
FOR k:=0 TO (ANZ) DO
    BEGIN
      readln(test,a);
      readln(test,b);
      readln(test,c);
      readln(test,d);
      readln(test,e);
      FuegeHintenAn(a,b,c,d,e,kopf,l);
    END;
  closefile(test);
  // kopf:=l; das ist falsch, weil Du da den Kopf immer auf das letzte Element zeigen läßt
               // der Kopf sollte auf das erste Element zeigen

  {ausgabeformular.TitelAUS.Items.Add(a);
  ausgabeformular.GenreAUS.Items.Add(b);
  ausgabeformular.JahrAUS.Items.Add(c);
  ausgabeformular.RegiseurAUS.Items.Add(d);
  ausgabeformular.SchauspielerAUS.Items.Add(e);}
end;
Habe etwas an Deinem Code geändert in der Hoffnung das es nun besser läuft.

kopf -> erstesElement, erstesElement^.next -> zweitesElement,zweitesElement^.next -> nil ; nil = Listenende

Grüße
Klaus

Tastaturkürzel 6. Dez 2006 21:54

Re: Fehlersuche bei Listen
 
Also der Fehler ist mitlerweile verschwunden...aber das war er ja eben auch bereits. Ein letzten Versuch mach ich noch, danach danke ich euch und lasse es auf sich beruhen denke ich.
Also meine Textdatei beinhaltet ca. 18 einträge. Wenn ich das ganze mir nun im Programm über die nun bekannte Ausgabe ausgeben lasse, bekomme ich 7 einträge richtig (glaube ich^^) angezeigt. Die 8.Ausgabe ist leer und danach passiert um genau zu sein NIX. Ne idee?

Meniskusschaden 6. Dez 2006 22:37

Re: Fehlersuche bei Listen
 
Zitat:

Zitat von Tastaturkürzel
Delphi-Quellcode:
anz:=filesize(test);
FOR k:=0 TO (ANZ) DO

Liegt der Fehler vielleicht hier? Filesize liefert m.E. doch
die Dateigröße und nicht die Anzahl der Textzeilen.

Klaus01 7. Dez 2006 09:01

Re: Fehlersuche bei Listen
 
Zitat:

Zitat von Tastaturkürzel
Also der Fehler ist mitlerweile verschwunden...aber das war er ja eben auch bereits. Ein letzten Versuch mach ich noch, danach danke ich euch und lasse es auf sich beruhen denke ich.
Also meine Textdatei beinhaltet ca. 18 einträge. Wenn ich das ganze mir nun im Programm über die nun bekannte Ausgabe ausgeben lasse, bekomme ich 7 einträge richtig (glaube ich^^) angezeigt. Die 8.Ausgabe ist leer und danach passiert um genau zu sein NIX. Ne idee?

Deine Datei hat 18 Zeilen, pro Listenelement ließt Du 5 Zeilen ein
Delphi-Quellcode:
FOR k:=0 TO (ANZ) DO
    BEGIN
      readln(test,a);
      readln(test,b);
      readln(test,c);
      readln(test,d);
      readln(test,e);
      FuegeHintenAn(a,b,c,d,e,kopf,l);
    END;
Macht also 3 Listenelemente. Und einen Lesefehler weil Du über das Dateiende hinausließt.
Mußt Du das mit TextDateien machen, es würde meines Erachtens einfacher
mit Records zu arbeiten, ein Listenelement = 1 Datensatz(Record).

Edit1: Aus der Delphi Hilfe: Note: FileSize can't be used on a text file.
Da hat Meniskusschaden wohl einen guten Ansatz geliefert.

Grüße
Klaus

Tastaturkürzel 7. Dez 2006 13:43

Re: Fehlersuche bei Listen
 
Also es waren schon 18 elemente a 5 strings. Denke aber das Hauptproblem liegt in der geschichte mit filesize. Nur wenn ich jetzt auf RECORDS umstellen will, würde ich doch alles abändern müssen (vor allem speichern und laden?!?) oder irre ich mich?

Klaus01 7. Dez 2006 13:53

Re: Fehlersuche bei Listen
 
ein wenig umstellen, schon.

Aber du brauchst dann halt nur einmal einen Datensatz einlesen umd alle 5 Strings zu lesen.
Der Record bindet halt alle Informationen eines Datensatzes zu einem Päckchen zusammen.

Oder Du liest die Daten mit

Delphi-Quellcode:
Zeile:=0;
while not eof(DeineDatei) do
  begin
    inc(zeile);
    ReadLn(DeineDatei,Daten);
    Case Zeile of
      1: a := daten;
      2: b := daten;
      3: c := daten;
      4: d := daten
      5: begin
            e:= daten;
            Zeile := 0;
          end;
    end;
  end;
ein.

Grüße
Klaus

Tastaturkürzel 7. Dez 2006 17:13

Re: Fehlersuche bei Listen
 
Leider verstehe ich deinen letzten Quellcode nicht so ganz...?!? Was muss ich bei "daten" einsetzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 Uhr.
Seite 2 von 3     12 3      

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