Hilfe, Stack Overflow!

01/29/2014 18:51 loop88#1
Hallo ich programmiere grade mein ersten bot mit "ImageSearch" und habe das Problem das nach einer weile die Fehlermeldung stack overflow kommt und ich weis nicht wie ich das verhindern soll.

Ich arbeite mit autoit seit 2 Wochen und das ist mein Ergebnis.

Ich hoffe das ihr mir helfen könnt.

Danke.

Der autoit code

kann geclosed werden :)
01/29/2014 18:55 qkuh#2
Die Funktionen bichos und bicho rufen sich gegenseitig auf. Irgendwann ist dann der Stack voll, weil Zustände, etc. dort abgelegt werden. Alle Rekursionen lassen sich iterativ realisieren. Versuch das mal.
01/29/2014 18:57 lolkop#3
Quote:
Originally Posted by loop88 View Post
Hallo ich programmiere grade mein ersten bot mit "ImageSearch" und habe das Problem das nach einer weile die Fehlermeldung stack overflow kommt und ich weis nicht wie ich das verhindern soll.

Ich arbeite mit autoit seit 2 Wochen und das ist mein Ergebnis.

Ich hoffe das ihr mir helfen könnt.

Danke.
befolge bitte folgende punkte:
  • gewöhne dir an mit EINER endlosschleife zu arbeiten.
  • versuche immer rekursion zu vermeiden
  • allgemeiner script aufbau:
    • <includes>
    • <hotkeys>
    • <variablen>
    • <guis>
    • <hauptschleife>
    • <funktionsdeklarationen>
01/29/2014 19:12 YatoDev#4
Bist dir sicher das der code oben von dir ist ? hab nie nen deutschen gesehen der seine variablen nicht deutsch oder english schreibt und in die ini auch
01/29/2014 19:22 loop88#5
Quote:
Originally Posted by »FlutterShy™ View Post
Bist dir sicher das der code oben von dir ist ? hab nie nen deutschen gesehen der seine variablen nicht deutsch oder english schreibt und in die ini auch

Ja der code ist von mir un diese Sprache ist Spanisch den denn ich habe lange zeit in Spanien gelebt.
bei der ini gebe ich zu, da habe ich mir den code zusame geklaut! :D

Quote:
Originally Posted by qkuh View Post
Die Funktionen bichos und bicho rufen sich gegenseitig auf. Irgendwann ist dann der Stack voll, weil Zustände, etc. dort abgelegt werden. Alle Rekursionen lassen sich iterativ realisieren. Versuch das mal.

wie kann ich das machen, kannst du das für ein anfänger erklären?

danke.

Quote:
Originally Posted by lolkop View Post
befolge bitte folgende punkte:
  • gewöhne dir an mit EINER endlosschleife zu arbeiten.
  • versuche immer rekursion zu vermeiden
  • allgemeiner script aufbau:
    • <includes>
    • <hotkeys>
    • <variablen>
    • <guis>
    • <hauptschleife>
    • <funktionsdeklarationen>
Wie soll ich eine rekursion vermeiden wenn der wert immer wieder überpruft werden soll? kannst du mir dabei helfen?
01/29/2014 20:11 lolkop#6
Quote:
Originally Posted by loop88 View Post
Wie soll ich eine rekursion vermeiden wenn der wert immer wieder überpruft werden soll? kannst du mir dabei helfen?
dein code ist stark vereinfacht dargestellt so aufgebaut:
Code:
a()
Func a()
	[...]
	b()
EndFunc
Func b()
	[...]
	a()
EndFunc
die funktionen rufen sich nach und nach immer weiter gegenseitig auf und werden so im stack aufgestapelt... da nie das ende einer funktion erreicht werden kann, wird der stack auch entsprechend nie wieder abgebaut und wächst bis es schließlich zum überlauf kommt...

um das problem zu beheben, kann man sie einfach direkt nacheinander in einer schleife abarbeiten:
Code:
While True
	a()
	b()
WEnd
Func a()
	[...]
EndFunc
Func b()
	[...]
EndFunc
Jede funktion wird beim aufruf auf den stack geladen und beim erreichen des ausstiegspunktes (Return oder EndFunc) wieder vom stack entfernt. folglich kann es nichtmehr zu einem stack überlauf kommen...

Edit:
das gleiche passiert im übrigen auch hier:
Code:
HotKeySet(<hotkey1>, 'a')
HotKeySet(<hotkey2>, 'b')
While True
WEnd
Func a()
	While True
		[...]
	WEnd
EndFunc
Func b()
	While True
		[...]
	WEnd
EndFunc
da der aufruf einer neuen funktion manuell ausgeführt wird (über hotkeys), dauert es entsprechend länger, bis der stacküberlauf sich ereignet. beim drücken des hotkeys wird eine neue funktion auf den stack gepackt, ohne das die alte funktion gelöscht werden kann (da sie nie einen ausstiegspunkt erreicht). deshalb darf eine pause funktion niemals so aufgebaut sein:
Code:
HotKeySet(<hotkey>, "pause")
While True
	[...]
WEnd
Func pause()
	While True
		[...]
	WEnd
EndFunc
letztendich wird auch hierdurch nach einer laufzeit x immer ein stack overflow auftauchen.

stattdessen arbeitet man mit zuständen:
Code:
HotKeySet(<hotkey>, "pause")
Global $pause
While True
	If Not $pause Then
		[...]
	EndIf
WEnd
Func pause()
	If $pause Then
		$pause = False
	Else
		$pause = True
	EndIf
EndFunc
oder einfacher:
Code:
HotKeySet(<hotkey>, "pause")
Global $pause
While True
	If Not $pause Then
		[...]
	EndIf
WEnd
Func pause()
	$pause = Not $pause
EndFunc
01/29/2014 20:43 loop88#7
Quote:
Originally Posted by lolkop View Post
dein code ist stark vereinfacht dargestellt so aufgebaut:
Code:
a()
Func a()
	[...]
	b()
EndFunc
Func b()
	[...]
	a()
EndFunc
die funktionen rufen sich nach und nach immer weiter gegenseitig auf und werden so im stack aufgestapelt... da nie das ende einer funktion erreicht
...

Danke für die super Erklärung ich werde mal das alles berücksichtigen und hoffen das ich alles richtig mache :D , melde mich dann wenn ich fertig bin und vielen vielen dank.:handsdown: