Hups, ich habe deinen Code wohl nicht aufmerksam genug gelesen. Also, erstmal einrücken:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| inherited Create; new(Knoten); new(test); new(test2); Stringlist := TStringlist.Create; for I := 1 to 44 do begin knoten^ := TKnoten.Create('',i,can); knoten^.SetNext(test); if (i+1)< 45 then begin test2 := knoten; knoten := test; knoten^.Previous := test2; new(test);
new(test2); end else knoten^.Previous := test2; end;
while (Knoten^.Previous <> nil) do Knoten := Knoten^.Previous; |
Der Fehler tritt also gar nicht im oberen Teil auf, sondern in der einzelnen
while-Schleife, in der du schlicht und einfach den ersten Knoten auswählst. Vorneweg, wenn ich das so richtig verstanden habe: Warum merkst du dir den nicht einfach zu Beginn?
Da der Fehler im zweiten Durchlauf der
while-Schleife auftritt, ist voher folgendes passiert:
- Knoten := Knoten^.Previous
- Aufgrund der ersten Bedingungsabfrage wissen wir, dass jetzt gilt: Knoten != nil.
- Allerdings ist nicht gesichert, ob Knoten^ != nil ist. Aufgrund der Exception ist also anzunehmen, dass irgend ein Element dieser Liste zwar Previous gesetzt hat, aber Previous^ nicht gesetzt ist.
Umgekehrter Ansatz: Im vorletzten Durchlauf der
for-Schleife haben wir am Ende ein neues, leeres
test2. Im letzten Durchlauf weisen wir dieses nun einem
knoten^.Previous zu. Dadurch ergibt sich, dass
knoten^.Previous^ nil ist. Also genau das, was wir oben festgestellt haben.
Hoffe, ich hab den Code jetzt richtig gelesen.
Edit: Dein Ansatz ist aber insgesamt ziemlich seltsam. Beispielsweise weist du die Eigenschaft
Previous zu, bevor du den Konstruktur aufrufst: Die Zuweisung in Zeile 15 bezieht sich ja schon auf das Objekt, das sich vorher hinter
test verborgen hatte, und noch gar nicht initialisiert war.
Edit2: Ist das hier vielleicht so in etwa, was du suchst?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| type TKnoten = record Prevoius: TKnoten; Next: TKnoten; end;
PKnoten = ^TKnoten;
var First, Current, Prevoius: PKnoten; i: Integer begin Previous := nil; First := nil;
for i := 1 to 44 do begin new(Current); Current^ := new TKnoten();
Current^.Previous := Previous; if First = nil then First := Current; if Previous <> nil then Previous^.Next := Current;
Previous = Current; end; end; |