Delphi-Version: 2010
Pointer of Array of Pointer neues Prinzip
Liste der Anhänge anzeigen (Anzahl: 1)
Nachdem ich mein Programm fertig habe, gab es eine neue Aufgabe:
Nun soll der Record Vorgänger, Wert und Nachfolger enthalten. Ich füge mal ein jpg ein, dass ich bekommen habe zur Hilfe. Nun wollte ich erstmal anfangen das eingeben zu Programmieren. Also die erste Eingabe ist der start record und zeigt auf den 2, der auf den 3 usw. Also ich hab mir das so gedacht, stimmt das? :
Delphi-Quellcode:
Type
PEintrag = ^TEintrag; TEintrag = Record Vorgaenger: PEintrag; Wert: integer; Nachfolger: PEintrag; End; Type TListe = Array Of PEintrag; PListe = ^TListe; Type TForm1 = Class(TForm) LBOutNumber: TListBox; EdGetNumber: TEdit; BtBeenden: TButton; BtSort: TButton; BtHinzufuegen: TButton; Procedure FormCreate(Sender: TObject); Procedure FormDestroy(Sender: TObject); private Liste: PListe; Eintrag: PEintrag; Procedure Input; ... End; .. Procedure TForm1.FormCreate(Sender: TObject); Begin Liste := Nil; New(Liste); End; Procedure TForm1.FormDestroy(Sender: TObject); Var i: integer; Begin For i := Low(Liste^) To High(Liste^) Do Dispose(Liste^[i]); Dispose(Liste); End; Procedure TForm1.Input; Var x, i: integer; Begin // Init mit nichts Eintrag := Nil; new(Eintrag); //neuen Eintrag in Array eintragen Eintrag^.Wert := StrToInt(EdGetNumber.Text); //Array um 1 erweitern SetLength(Liste^, Length(Liste^) + 1); //Zahl ans Ende des Arrays eintragen x := high(Liste^); Liste^[x] := Eintrag; //Erste Eintrag hat den Vorgänger Nil Liste^[low(Liste^)].Vorgaenger := Nil; Liste^[low(Liste^)].Nachfolger := Liste^[(low(Liste^)+1)]; //Vorgänger und Nachfolger der Einträge festlegen For i := (low(Liste^) + 1) To (high(Liste^) - 1) Do Begin Liste^[i].Vorgaenger := Liste^[i - 1]; Liste^[i].Nachfolger := Liste^[i + 1]; End; //Letzte Eintrag hat den NAchfolger Nil Liste^[high(Liste^)].Vorgaenger := Liste^[(high(Liste^)-1)]; Liste^[high(Liste^)].Nachfolger := Nil; End; |
AW: Pointer of Array of Pointer neues Prinzip
Das riecht stark nach doppelt verketteter Liste, dazu gibt es IIRC sogar ein Tutorial hier in der DP.
[edit] Japp, gefunden [/edit] |
AW: Pointer of Array of Pointer neues Prinzip
dann werde ich da mal rein schauen und mich schlau machen :-P
|
AW: Pointer of Array of Pointer neues Prinzip
So, nun habe ich mich schlau gemacht, bekomme aber beim schließen meines Programme eine Fehlermeldung "Zugriffsverletzung"..wo liegt mein Fehler:
Delphi-Quellcode:
Type PEintrag = ^TEintrag; TEintrag = Record Vorgaenger: PEintrag; Wert: integer; Nachfolger: PEintrag; End; Type TListe = Array Of PEintrag; PListe = ^TListe; Type TForm1 = Class(TForm) LBOutNumber: TListBox; EdGetNumber: TEdit; BtBeenden: TButton; BtSort: TButton; BtHinzufuegen: TButton; private Liste: PListe; Eintrag: PEintrag; Procedure AddElement(Wert: integer); Procedure FreeKette; End; Var Form1: TForm; First: PEintrag; //Anfang der Kette als globale Variable Implementation {$R *.dfm} Procedure TForm1.FormCreate(Sender: TObject); Begin Liste := Nil; New(Liste); End; Procedure TForm1.FormDestroy(Sender: TObject); Var i: integer; Begin For i := Low(Liste^) To High(Liste^) Do Dispose(Liste^[i]); Dispose(Liste); FreeKette; End; Procedure TForm1.BtHinzufuegenClick(Sender: TObject); Begin Try AddElement(StrtoInt(EdGetNumber.Text)); EDGetNumber.Clear; Except ShowMessage('Nur Zahlen bitte'); EDGetNumber.Clear; End; End; Procedure TForm1.AddElement(Wert: integer); Var hlp, hlp2: PEintrag; Begin //Anfang vorhanden ? If (FIRST = Nil) Then Begin New(First); First^.Vorgaenger := Nil; //Der Anfang der Kette hat keinen Vorgänger; First^.Nachfolger := Nil; //Der Nachfolger ist auch erstmal nicht vorhanden. hlp2 := First; End Else Begin hlp := First; While (hlp^.Nachfolger <> Nil) Do hlp := hlp^.Nachfolger; new(hlp^.Nachfolger); hlp2 := hlp^.Nachfolger; hlp2^.Vorgaenger := hlp; End; hlp^.Wert := Wert; End; Procedure tForm1.FreeKette; Var wrk: PEintrag; Begin wrk := First^.Nachfolger; While (wrk <> Nil) Do Begin Dispose(first); first := wrk; wrk := wrk^.Nachfolger; End; Dispose(first); End; End. |
AW: Pointer of Array of Pointer neues Prinzip
In welcher Zeile denn?
|
AW: Pointer of Array of Pointer neues Prinzip
in keiner Zeile..Programm startet normal. Wenn ich dann Zahlen einfüge und mein TForm1 schließe, bekomme ich den Fehler angezeigt
|
AW: Pointer of Array of Pointer neues Prinzip
Dann stepp doch einmal durch und schau, in welcher Zeile der Fehler auftritt. Übrigens: wozu ist eigentlich das Array gut, das wird doch gar nicht benutzt?
|
AW: Pointer of Array of Pointer neues Prinzip
wie gehe ich denn einzeln da durch, habs mit f7 gemacht. und bekomme den fehler erst ganz am ende, wenn das programm schon beendet ist.
Zitat:
Zitat:
|
AW: Pointer of Array of Pointer neues Prinzip
Vielleicht ist der Aufruf von FreeKette im Destruktor nach der Freigabe der Liste keine gute Idee
|
AW: Pointer of Array of Pointer neues Prinzip
auch wenn ich freeKette auskommentiere kommt der fehler
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz