Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stack-Overflow abfangen (https://www.delphipraxis.net/162259-stack-overflow-abfangen.html)

SirThornberry 15. Aug 2011 12:37

AW: Stack-Overflow abfangen
 
Delphi-Quellcode:
Bedenkt aber, daß man auch etwas mehr Speicher benötigt, wenn man sich den Weg merkt, da dieses für jede Rekusrionsebene einzeln gepeichert (kopiert und erweitert) werden muß.
Da hast du einen Denkfehler.
Man muss sich maximal so viel Felder merken wie es insgesamt gibt (nicht alle Kombinationen). Zudem kann man auch noch mit Bits arbeiten (Pro Feld ein Bit) und schon benötigt man gar nicht mehr sooo viel Speicher.

FredlFesl 15. Aug 2011 13:19

AW: Stack-Overflow abfangen
 
Echt? Ich würde der Matrix ein weiteres Feld gönnen (Visited:Boolean).
Betrete ich das Feld, prüfe ich, ob Visited=True, wenn ja, beende ich die Routine, ich war ja schon mal da.
Ansonsten setze ich Visited=True, suche nach weiteren Wegen und nehme aber nur die Nachbarfelder mit ins Boot, die ich noch nicht besucht habe.

Dann rufe ich mich selbst mit allen Nachbarkandidaten rekursiv auf.

Bevor ich die Routine verlasse, setze ich Visited wieder auf False:

Delphi-Quellcode:
Procedure TMatrix.Visit (Source : TPoint; Path : TPath);
Begin
  If Source = FinalDestination then
     Success(Path)
  Else If not Self.Visited[Source] Then begin
    Self.Visited[Source] := True;
    Foreach Neighbor in Source.Neighbors do
      If not Self.Visited[Neighbor] Then
        Visit(Neighbor, Path+Neighbor)
    Self.Visited[Source] := False;
  End
End;

himitsu 15. Aug 2011 16:14

AW: Stack-Overflow abfangen
 
OK, einen Denkfehler hab ich schon, wenn man die betretenen Felder wieder frei gibt, sobald mein wieder eine Ebene zurück geht, dann stimmt es. :oops:

FredlFesl 15. Aug 2011 18:30

AW: Stack-Overflow abfangen
 
Oder einfach gleich A* nehmen, schließlich will er ja einen Weg von A->B finden.

Luckie 15. Aug 2011 20:56

AW: Stack-Overflow abfangen
 
Das ist mir auch schon die ganze zeit im Kopf rumgeschwirrt. Hie rgibt es ein Demo und ein Tutorial: http://www.michael-puff.de/Programmierung/Delphi/Demos/

Delphi-Laie 16. Aug 2011 15:58

AW: Stack-Overflow abfangen
 
Zitat:

Zitat von Sinthuor (Beitrag 1116853)
Problematisch wird es sobald ein Weg vor dem Ziel einen "Kreis bildet":
...
Hier kommt es zu einer Endlosschleife und dadurch zu einem Stackoverflow - den ich abfangen und stattdessen eine Fehlermeldung ausgeben möchte.

Das Problem ist hier nicht, irgendwelche Exceptions abzufangen (die auf ein grundlegende(ere)s Problem hindeuten), sondern der Fehler im Suchalgorithmus: Die Endlosschleifen entstehen m.E., weil es beim Suchen des Wegen gestattet ist, teilweise rückwärts zu gehen.

Ein korrekter Algorithmus wird bei diesen kleinen Feldern nie zu einem Stacküberlauf führen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.
Seite 2 von 2     12   

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