Autor Beitrag
Sylvus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Mi 07.10.09 19:54 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.