Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TImage - Rekursiv - Stack


Sylvus - Mi 07.10.09 19:54
Titel: TImage - Rekursiv - Stack
Hay Leute, ich hab eine Rekursive Funktion die leider mit einem Stack-Overflow endet.
Ich versuch das ganze jetzt grad etwas zu optimieren. Dazu folgende Fragen:

Ich frage einen RGB Wert ziemlich häufig mit:
GetGValue(Form1.Bild.Canvas.Pixels[X,Y]); ab. Da wollte ich gerne wissen, ob es schlauer ist, das Bild irgendwie anders zu speichern und nicht immer über das ganze Form1.Canvas.... zu gehen!?


Für die nächste Frage hier mal die Funktionsweise:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Gehe nach links -> erlaubt:
Rufe dich selbst mit neuem Standpunkt auf
sonst: 

Gehe nach unten -> erlaubt:
Rufe dich selbst mit neuem Standpunkt auf
sonst: 

Gehe nach rechts -> erlaubt:
Rufe dich selbst mit neuem Standpunkt auf
sonst: 

Gehe nach oben -> erlaubt:
Rufe dich selbst mit neuem Standpunkt auf
sonst: exit;


Ich markiere also verschiedene Bereiche, dabei geh ich jedes mal in alle vier Richtungen (links, rechts, unten, oben). Wenn er einen erlaubten Punkt hat geht er von dem aus weiter.
Es kann jetzt aber sein, dass ein Punkt noch 3 offene Wege hat, diese Punkte aber schon von einer anderen Funktion besucht wurden.
Das er diesen Wegen nicht mehr nachgeht ist klar, aber ich würd gerne die ganze Funktion aus dem Speicher löschen. Geht das irgendwie?



Hoffe ihr könnt mir helfen!
Vielen Dank


Boldar - So 18.10.09 12:57

Nimm am besten canvas.scanline
ausserdem:
Lässt sich das was du vorhast, nicht einfacher lösen?
Was soll denn das Ziel dieser Sache sein, und wie wird erlaubt ermittelt?


jakobwenzel - So 18.10.09 14:07

Du kannst den Stacküberlauf vermeiden, indem du die Funktion iterativ aufbaust, dir also ne Liste mit noch zu besuchenden Punkten anlegst und die abarbeitest.
Du musst aber drauf achten dass du schon besuchte Punkte nicht mehr in die Liste hinzufügst, sonst ist dein Arbeitsspeicher relativ schnell zu Ende.