Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer of Array of Pointer neues Prinzip (https://www.delphipraxis.net/164992-pointer-array-pointer-neues-prinzip.html)

Marcel2906 9. Dez 2011 08:36

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;

DeddyH 9. Dez 2011 08:48

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]

Marcel2906 9. Dez 2011 08:55

AW: Pointer of Array of Pointer neues Prinzip
 
dann werde ich da mal rein schauen und mich schlau machen :-P

Marcel2906 9. Dez 2011 09:41

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.

DeddyH 9. Dez 2011 09:49

AW: Pointer of Array of Pointer neues Prinzip
 
In welcher Zeile denn?

Marcel2906 9. Dez 2011 09:56

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

DeddyH 9. Dez 2011 09:57

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?

Marcel2906 9. Dez 2011 10:04

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:

Übrigens: wozu ist eigentlich das Array gut, das wird doch gar nicht benutzt?
Später möchte ich die Kette sortieren. Glaube dann brauch ich das array, oder nicht?? ^^

Zitat:

Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 004ADCFF in Modul 'Pointer.exe'. Lesen von Adresse 00000010'. Prozess Pointer.exe (3264)

Bummi 9. Dez 2011 10:08

AW: Pointer of Array of Pointer neues Prinzip
 
Vielleicht ist der Aufruf von FreeKette im Destruktor nach der Freigabe der Liste keine gute Idee

Marcel2906 9. Dez 2011 10:15

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.
Seite 1 von 3  1 23      

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