Mit GOTO aus verschachtelten Funktionen springen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Kernel32

Betreff: Mit GOTO aus verschachtelten Funktionen springen

BeitragDo, Jan 31, 2008 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal eine Verständnisfrage: wenn ich eine Funktion A aufrufe und in dieser zu Funktion B springe (also eine Ebene tiefer) dann springt Blitz bei einem "Return" ja wieder eine Ebene nach oben, also zurück nach Funktion A.

Wenn ich mich jetzt aber tief in verschachtelten Funktionen befinde und mich nicht von einer Funktion zur anderen "zurückarbeiten" möchte, sondern irgendwo von der 30. verschachtelten Funktion aus SOFORT zurück ins Hauptprogramm möchte (ohne das Blitz erst wieder alle vorherigen Funktionen rückwärts durchläuft), könnte man doch GOTO benutzen.

Also meine Frage ist wohl genauer: löscht GOTO sauber den Stack für den Funktionsaufrufe? Oder gibt es irgendwann einen Stack Overflow, wenn ich "hart" aus verschachtelten Funktionen rausspringe?
-------------
Wollte neulich Herrn Brot anrufen, aber da war belegt.
Dann hab ich bei Wheight Watcher's angerufen, aber niemand hat abgenommen.
Schliesslich hab ich im Irak angerufen, aber dort war besetzt o.O

SpionAtom

BeitragDo, Jan 31, 2008 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Die direkte Antwort auf deine Frage hab ich nicht. Aber ich hab einen Workaround:
Und zwar einen festgelegten Return (in diesem Fall 0), der alle Functions dazu veranlasst, abzubrechen.

Code: [AUSKLAPPEN]
   I()
   WaitKey
   End


Function I()
   Print "I"
   If dont() = 0 Then Return 0
End Function

Function dont()
   Print "dont"
   If need() = 0 Then Return 0
End Function

Function need()
   Print "need"
   If goto_() = 0 Then Return 0
End Function

Function goto_()
   Print "goto"
   Return 0   
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Kernel32

BeitragDo, Jan 31, 2008 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wollte ich eigentlich vermeiden, weil das den Code aufbläht und unübersichtlicher macht. Ausserdem ist das recht umständlich wenn man eine Funktion in mehrmals aus einer anderen Funktion aufruft.

Aber etwas anderes wird mir wohl nicht übrig bleiben, da mir gerade wieder eingefallen ist, daß man in Blitz von einer Funktion aus nicht mit GOTO zu einem Label ausserhalb der Funktion springen kann ("Undefined Label...") Crying or Very sad
-------------
Wollte neulich Herrn Brot anrufen, aber da war belegt.
Dann hab ich bei Wheight Watcher's angerufen, aber niemand hat abgenommen.
Schliesslich hab ich im Irak angerufen, aber dort war besetzt o.O

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 31, 2008 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Man sollte sowieso keine Schleifen mit einem Goto vorzeitig verlassen, da es eben zu einem Stack -overflow kommt. Was deine Codestruktur angeht, so bin ich mir sicher, dass dir da etwas sinnvolles einfällt. Ich hatte auch grad vor weniger Tagen das Problem, und habe durch etwas überlegen meine Struktur komplett verbessern können.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Matthias

BeitragDo, Jan 31, 2008 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh mann könnte vieleicht einen Functionsmanager benutzen.


Also so.
Code: [AUSKLAPPEN]

Graphics 800,600,32,2

Global FuncLink$="Autos"

SetBuffer BackBuffer()
Repeat:


UpdateFuncLink()


Flip

Until KeyDown(1)
End


Function UpdateFuncLink()
 Select FuncLink
  Case "Autos"  Autos()
  Case "Bäume"  Baume()
  Case "Häuser" Hauser()
 End Select
End Function


Function Autos()
If KeyHit(57)=1 Then FuncLink="Bäume":Return
Print "Autos"
End Function


Function Baume()
Print "Bäume"
End Function

Function Hauser()
Print "Häuser"
End Function
 

Dreamora

Betreff: Re: Mit GOTO aus verschachtelten Funktionen springen

BeitragDo, Jan 31, 2008 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Kernel32 hat Folgendes geschrieben:
Mal eine Verständnisfrage: wenn ich eine Funktion A aufrufe und in dieser zu Funktion B springe (also eine Ebene tiefer) dann springt Blitz bei einem "Return" ja wieder eine Ebene nach oben, also zurück nach Funktion A.

Wenn ich mich jetzt aber tief in verschachtelten Funktionen befinde und mich nicht von einer Funktion zur anderen "zurückarbeiten" möchte, sondern irgendwo von der 30. verschachtelten Funktion aus SOFORT zurück ins Hauptprogramm möchte (ohne das Blitz erst wieder alle vorherigen Funktionen rückwärts durchläuft), könnte man doch GOTO benutzen.


die einfache lösung ist es einfach nicht blödsinnig mit funktionen zu verschachteln.
Blitz hat nicht aus Jux support für Gosub Smile

Aber ich würd sagen ein richtig strukturierter Code hilft da bedeutend mehr ... würd sagen du hast es mit "funktionen draus bauen" einfach massiv übertrieben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group