![]() |
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:
Wie gesagt, das Erstellen klappt. Aber muss ich beim Beenden was beachten? Irgendwas freigeben?
// 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; ... Danke, ManuMF |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
das wirklich interessante hast du aber wggwlassen, und wie sieht der Code zum Beenden aus?
|
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hallo,
Delphi-Quellcode:
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.
MainForm.Close;
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. |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Einen dyn. Array "leert" man mit
Delphi-Quellcode:
setLength( arr, 0);
|
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 |
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 |
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.
|
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:
@Khabarakh: Wie meinst du das? Bzw. wie kann ich das vermeiden?
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; Gruß, ManuMF |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Zitat:
|
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 |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hi Manumf. :hi:
Zeig doch mal den Konstruktor-Code. Und benenn den Konstruktor nach Create um. Init, das gab's mal unter TurboPascal... ;-) |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hallo,
unser Lehrer meinte, wir sollen es so nennen, um es nicht mit create zu verwechseln :gruebel: Hier der Code:
Delphi-Quellcode:
Der Aufruf siehe mein Beitrag #8.
constructor TKnoten.Init;
begin Position := Point(0, 0); // um später schnell anzuzeigen, wo er liegt Nummer := 0; // auch für die Anzeige KLinks := nil; // die Verknüpfungen KRechts := nil; KOben := nil; KUnten := nil; Genutzt := false; // wird für den Durchlauf gebraucht end; Gruß, ManuMF |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hi.
Delphi-Quellcode:
Die Dimensionierung steht in keinem Verhältnis zu den von dir verwendeten Indexwerten.
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; Grüße vom marabu |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hallo,
stimmt! :wall: Ich habe es jetzt korrigiert:
Delphi-Quellcode:
Aber warum hat das Erstellen trotzdem geklappt? :gruebel: Die Meldung kommt übrigens immer noch, zuerst aber eine mit ungültiger Zeigeroperation.
SetLength(Knoten, PredSqr((LZahl)));
Gruß, ManuMF |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Zitat:
Zitat:
|
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Zitat:
Zitat:
Gruß, ManuMF |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hi Manumf.
Zitat:
(Lehrer gibt's) Sähe dann so aus:
Delphi-Quellcode:
constructor TKnoten.Create;
begin inherited; // <-- GANZ BESONDERS WICHTIG!!! Position := Point(0, 0); // um später schnell anzuzeigen, wo er liegt Nummer := 0; // auch für die Anzeige KLinks := nil; // die Verknüpfungen KRechts := nil; KOben := nil; KUnten := nil; Genutzt := false; // wird für den Durchlauf gebraucht end; |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Zitat:
Zitat:
|
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Hallo,
Danke an Alle! :-D Warum auch immer, erst jetzt kam "Fehler bei Bereichsprüfung", obwohl ich es schon nach dem Beitrag von Khabarakh aktiviert hatte. Und jetzt ist es mir klar: Die Länge für SetLength muss ja = die höchste Knotennummer + 1 sein, da ich bei 0 anfange... :wall: So kommt jetzt auch keine Meldung mehr. Gruß, ManuMF P.S.: Ist es nun besser, Create zu verdecken, oder Init o.Ä. zu verwenden? ;-) |
Re: Probleme mit dyn. Array & pseudo-doppelt verketteter
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr. |
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