Line -1 ERROR Auto it stack overflow

  • Hy @ ALL

    Hab n risen problem !!!

    hab n kleines skript laufen. funktioniert auch wunderbahr!!!

    aber nach ner halben stunde kommt

    folgende FEHLERMELDUNG


    WARUM ??

    siehe auch den ausschnitt meines programms

    Spoiler anzeigen
    [autoit]


    Func manistart()

    sleep(100)

    Run($prg) ; starten vom mani programmierprogramm

    sleep(100)

    GUIDelete() ; Löschen des Hauptfensters

    sleep(100)

    guineu()

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func guineu()

    GUIDelete() ; Löschen des Hauptfensters

    sleep(50)

    GUICreate("Zählung korrigieren", 350,110,$guix,$guiy)
    GUICtrlCreateLabel("Wenn ein Prüfling durch Sichtkontrolle als fehlerhaft" , 1,1)
    GUICtrlCreateLabel("nochmal programmiert werden soll. Bitte - Stück +1 - drücken", 1,15)

    $plus1 = GUICtrlCreateButton("Stück +1", 2,35 , 150)
    $minus1 = GUICtrlCreateButton(" -1 ", 158,35 , 35)
    $ende = GUICtrlCreateButton("BEENDEN", 199,35 , 150)

    GUICtrlCreateLabel("Aktueller EAN-Code "&$eingabe, 0,70)

    GUISetState(@SW_SHOW)

    ;sleep(10)

    zaehlstart() ; sprung zu unterfunktion manistart

    EndFunc

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    ;--------------

    Func zaehlstart()

    sleep(100)

    $msg2 = GUIGetMsg () ; Einlesen der Eingabe in die Variable $msg

    ;Sleep(50)

    Select
    case $msg2 = $plus1 ;Auslesen der Eingabe (ok oder abbrechen)
    ;Sleep(50)
    $stueck = $stueck + $eins
    ;guineu()

    case $msg2 = $minus1 ;Auslesen der Eingabe (ok oder abbrechen)
    ;Sleep(50)
    $stueck = $stueck - $eins
    ;guineu()

    case $msg2 = $ende ;Auslesen der Eingabe (ok oder abbrechen)
    ;Sleep(50)
    manikill()

    EndSelect

    ;Sleep(100)

    ToolTip("Momentan sind noch "&$stueck& " zu testen" ,$guix+1,$guiy+115) ; tooltip anzeige ( für Zählstatus )

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(100)

    [/autoit] [autoit][/autoit] [autoit]

    $wertdll = DllCall("inpout32.dll", "short", "Inp32", "short", "0x379")

    [/autoit] [autoit][/autoit] [autoit]

    ;Sleep(50)

    [/autoit] [autoit][/autoit] [autoit]

    $wert = $wertdll[0]

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(50)

    [/autoit] [autoit][/autoit] [autoit]

    If $wert = $tasterhy Then
    ;Sleep(50)
    tasteda() ; zu funktion Taste da
    EndIf


    Sleep(50)
    zaehlstart() ; sprung zu...

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    ;-----------------------------------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func tasteda()

    sleep(250)

    $wertdll = DllCall("inpout32.dll", "short", "Inp32", "short", "0x379")

    ;Sleep(50)

    $wert = $wertdll[0]

    ;Sleep(50)

    If $wert = $tasterhy Then
    ;Sleep(50)
    tasteda()
    EndIf

    ;Sleep(50)
    zaehlen()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    ;-----------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func zaehlen()
    ;sleep(100)

    $stueck = $stueck - $eins ; stückzahl um 1 verringern

    ;sleep(50)

    IF $stueck = 0 then ; abfrage ob stückzahl = 0
    ;sleep(50)
    manikill()

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;Sleep(50)

    zaehlstart()

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;exit
    ;-----------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func manikill()

    GUIDelete()

    ;sleep(50)

    WinKill("ManI-US2") ; mani schließen

    ;sleep(50)

    WinKill("ManI")

    if WinExists("ManI-US2")Then
    manikill()
    EndIf

    if WinExists("ManI")Then
    manikill()
    EndIf

    exit
    EndFunc

    [/autoit]


    DANKE
    schon im vorraus

    Einmal editiert, zuletzt von vivus (13. Dezember 2007 um 10:00)

  • das liegt daran, dass du die Funktion tasteda() in der funktion wieder selbst aufrufst

    [autoit]

    Func tasteda()

    sleep(250)

    $wertdll = DllCall("inpout32.dll", "short", "Inp32", "short", "0x379")

    ;Sleep(50)

    $wert = $wertdll[0]

    ;Sleep(50)

    If $wert = $tasterhy Then
    ;Sleep(50)
    tasteda() ; hier um genau zu sein, ist der Fehler
    EndIf

    ;Sleep(50)
    zaehlen()

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]
  • hi,

    in der Func manikill() ist das selbe problem wie bei der Func tasteda(). auch dort wird die funktion in sich selbst nochmal aufgerufen (schleifenproblem).

    gruss exberliner

  • OK ...

    gut zu wissen..

    ABER ??!!

    Wie schreibe ich des dann richtig ?!

    While schleife ok ....

    aber wie kann ich springen ?

    und warum darf man aus einem unterprogramm nicht das unterprogramm aufrufen ?!

    ging doch früher mit goto auch?...

  • so besser ?!

    Spoiler anzeigen
    [autoit]

    Func manistart()

    sleep(100)

    Run($prg) ; starten vom mani programmierprogramm

    sleep(100)

    GUIDelete() ; Löschen des Hauptfensters

    sleep(100)

    GUIDelete() ; Löschen des Hauptfensters

    sleep(50)

    GUICreate("Zählung korrigieren", 350,110,$guix,$guiy)
    GUICtrlCreateLabel("Wenn ein Prüfling durch Sichtkontrolle als fehlerhaft" , 1,1)
    GUICtrlCreateLabel("nochmal programmiert werden soll. Bitte - Stück +1 - drücken", 1,15)

    $plus1 = GUICtrlCreateButton("Stück +1", 2,35 , 150)
    $minus1 = GUICtrlCreateButton(" -1 ", 158,35 , 35)
    $ende = GUICtrlCreateButton("BEENDEN", 199,35 , 150)

    GUICtrlCreateLabel("Aktueller EAN-Code "&$eingabe, 0,70)

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While $stueck > 0

    sleep(10)

    $msg2 = GUIGetMsg () ; Einlesen der Eingabe in die Variable $msg


    Select
    case $msg2 = $plus1 ;Auslesen der Eingabe (ok oder abbrechen)
    $stueck = $stueck + 1


    case $msg2 = $minus1 ;Auslesen der Eingabe (ok oder abbrechen)
    $stueck = $stueck - 1


    case $msg2 = $ende ;Auslesen der Eingabe (ok oder abbrechen)
    GUIDelete()

    while WinExists("ManI-US2")
    WinKill("ManI-US2") ; mani schließen
    WEnd

    while WinExists("ManI")
    WinKill("ManI") ; mani schließen
    WEnd

    Exit

    EndSelect

    sleep(10)

    ToolTip("Momentan sind noch "&$stueck& " zu testen" ,$guix+1,$guiy+115) ; tooltip anzeige ( für Zählstatus )

    sleep(10)

    [/autoit] [autoit][/autoit] [autoit]

    $wertdll = DllCall("inpout32.dll", "short", "Inp32", "short", "0x379")

    [/autoit] [autoit][/autoit] [autoit]

    sleep(10)

    $wert = $wertdll[0]

    [/autoit] [autoit][/autoit] [autoit]

    If $wert = 118 then
    tasteda()
    $stueck = $stueck - 1
    EndIf

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    GUIDelete()


    while WinExists("ManI-US2")
    WinKill("ManI-US2") ; mani schließen
    WEnd

    while WinExists("ManI")
    WinKill("ManI") ; mani schließen
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    exit

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func tasteda()

    While $wert = 118
    sleep(10)

    $wertdll = DllCall("inpout32.dll", "short", "Inp32", "short", "0x379")

    sleep(10)

    $wert = $wertdll[0]

    sleep(10)

    WEnd
    EndFunc

    [/autoit]