Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit dyn. Array & pseudo-doppelt verketteter Liste (https://www.delphipraxis.net/71710-probleme-mit-dyn-array-pseudo-doppelt-verketteter-liste.html)

ManuMF 19. Jun 2006 20:13


Probleme mit dyn. Array & pseudo-doppelt verketteter Lis
 
Hallo,

im Unterricht programmieren wir gerade eine Art Labyrinth, das durchlaufen werden soll. Es besteht quasi aus einzelnen Feldern. Diese Felder sollen in einem Array abgelegt werden (für den leichten Zugriff), und die umgebenden Felder sind dem jeweiligen Feld bekannt (das ist die pseudo-doppelt verkettete Liste).

Damit man die Größe frei wählen kann, soll das Array dynamisch sein. Soweit sogut - das Erstellen klappt, auch das Laden aller "Knoten" (also Felder) in ein ListView.

Aber wenn ich das Programm beende, erscheint eine Zugriffsverletzung oder ein Runtime Error. Woran kann das liegen?

Hier ein bisschen Code:
Delphi-Quellcode:
// Die Listenstruktur:
type TKnoten = class(TObject)
  Oben: TKnoten;
  Unten, Links, Rechts: "
  end;

// Vorbereitung der Liste:
SetLength(KArray, [User-Eingabe]);
ListeErstellen;

// procedure ListeErstellen
// [Schleife]
KArray[SchleifenVeriable] := TKnoten.Init;
...
Wie gesagt, das Erstellen klappt. Aber muss ich beim Beenden was beachten? Irgendwas freigeben?

Danke,
ManuMF

mkinzler 19. Jun 2006 20:17

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
das wirklich interessante hast du aber wggwlassen, und wie sieht der Code zum Beenden aus?

ManuMF 19. Jun 2006 20:20

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Hallo,

Delphi-Quellcode:
MainForm.Close;
Mehr nicht ;-) . Bei der "normalen" doppelt verketteten Liste müsste man nichts machen, hat unser Info-Lehrer gesagt. Ich habe trotzdem immer Knoten für Knoten mit FreeAndNil eliminiert. Aber da hatten wir natürlich kein Array.

Gruß,
ManuMF

P.S.: Die Zugriffsverletzung kam aus einem anderen Grund, aber der Runtime Error kommt immer - es sei denn, man lässt die Liste bzw. das Array nicht erstellen.

mkinzler 19. Jun 2006 20:23

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Einen dyn. Array "leert" man mit
Delphi-Quellcode:
setLength( arr, 0);

ManuMF 19. Jun 2006 20:27

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Hallo,

ich habe es probiert, dann kommt aber eine Zugriffsverletzung, und beim 2ten Versuch wird das Programm erst geschlossen. Die AV kommt ebenfalls nicht, wenn die Liste nicht erstellt wurde.

Gruß,
ManuMF

omata 19. Jun 2006 20:30

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Schreib doch nochmal etwas mehr Code.

Und was ist .Init? Soll das der Konstruktor sein? Wenn man mit setlength das dynamische Array löscht, sind aber immer noch nicht die Objekte in der Liste freigegeben. Und eine doppeltverkettete Liste ist was ganz anderes, die wird mit New und Dispose erstellt bzw. gelöscht.

Hier wird ja alles in einen Topf geschmissen.

Gruss
Thorsten

Khabarakh 19. Jun 2006 20:43

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Ich denke, du versuchst, Objekte mehrmals freizugeben (schließlich gibt es 3-5 Referenzen auf jeden Knoten), was natürlich nicht funktioniert.

ManuMF 19. Jun 2006 20:45

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Hallo,

yepp, Init ist der Constructor. Das mit den Knoten haben wir eben aus der doppelt verketteten Liste, wie wir sie im Unterricht durchgenommen haben. Bei dieser Version wurde ein neuer Knoten initialisiert und dann in die Liste geschoben und die Verknüpfungen neu gesetzt. Beim Beenden habe ich dann wie schon gesagt Knoten für Knoten aus der Liste genommen und dann mit FreeAndNil eliminiert. Jetzt haben wir eben ein Array - natürlich ist das keine doppelt verkettete Liste mehr, aber eben die Felder "kennen sich" wie in einer Liste. Die Struktur hat uns unser Lehrer vorgegeben.

Hier noch der Code für das Erstellen:

Delphi-Quellcode:
var
  LZahl: Cardinal = User-Eingabe, bei meinen Tests 3
  Knoten: Array of TKnoten;

{----------}

var X, Y: Cardinal;

begin
   SetLength(Knoten, Pred(LZahl));

   for Y := 0 to Pred(LZahl) do
   begin
      for X := 0 to Pred (LZahl) do
      begin
         Knoten[X + (Lzahl * Y)] := TKnoten.Start;
         Knoten[X + (Lzahl * Y)].Position := Point(X, Y);
         Knoten[X + (Lzahl * Y)].Nummer := X + (Lzahl * Y);
      end;
   end;

   for Y := 0 to Pred(LZahl) do
   begin
      for X := 0 to Pred (LZahl) do
      begin
         if (X <> 0) then
            Knoten[X + (Lzahl * Y)].KLinks := Knoten[X + (Lzahl * Y) - 1];

         if (X <> Pred(LZahl)) then
            Knoten[X + (Lzahl * Y)].KRechts := Knoten[X + (Lzahl * Y) + 1];

         if (Y <> 0) then
            Knoten[X + (Lzahl * Y)].KOben := Knoten[X + (Lzahl * Y) - Lzahl];

         if (Y <> Pred(Lzahl)) then
            Knoten[X + (Lzahl * Y)].KUnten := Knoten[X + (Lzahl * Y) + Lzahl];
      end;
   end;

   InListviewEinlesen;
@Khabarakh: Wie meinst du das? Bzw. wie kann ich das vermeiden?

Gruß,
ManuMF

Khabarakh 19. Jun 2006 20:56

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Zitat:

Zitat von ManuMF
@Khabarakh: Wie meinst du das? Bzw. wie kann ich das vermeiden?

Deinen Aufräum-Code zu zeigen wäre kein schlechter Anfang :stupid: . Grundsätzlich solltest du die Knoten nur über das Array und nicht untereinander freigeben.

ManuMF 20. Jun 2006 12:52

Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
 
Hallo,

wie ich schon geschrieben habe: Ich habe keinen Code zum Aufräumen :cyclops:
Das Knoten-für-Knoten-löschen habe ich bisher nur in der Liste gemacht.

Gruß,
ManuMF


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 1 von 2  1 2      

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