Return ohne Gosub

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

nebelhorn

Betreff: Return ohne Gosub

BeitragSa, Aug 02, 2008 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite zur Zeit an einem Jump'n Run Spiel. Ist auch schon fast fertig und jetzt mache ich gerade den Leveleditor. Das sieht bis jetzt so aus:
Code: [AUSKLAPPEN]

;Grundsätzliche Dinge
Include "Engine.bb"
Graphics 640,480
SetBuffer BackBuffer()
;Graphiken laden
;Hier werden die Graphiken geladen(nicht wichtig für das Problem)

Goto Hauptschleife
End
;Level laden
;-----------
.LadeLevel
;Jede Menge Code der jetzt nicht wichtig ist.
Return

;Hauptschleife
.Hauptschleife
Repeat
;Eingaben Auswerten
If KeyDown(60) Then
  Repeat
    LevelNr$ = Input(100,100,LevelNr)
    Gosub Anzeigen
  Until KeyDown(28)
  Gosub LadeLevel
EndIf


;Ausgabe
.Anzeigen
Hier sollen Später die Anzeigen hinkommen
Return
Until KeyDown(1)


Jetzt kommt wenn das Programm zu dem Return nach dem Anzeigen kommt immer die Meldung "Programm has ended" (im Debug Modus)

Eigentlich soll das Programm einfach so weitelaufen und nur wenn es von dem Gosub gekommen ist dorthin zurückspringen.

Die Input() Version ist übrigens so in Engine.bb:
Code: [AUSKLAPPEN]

Function Input$(bx,by,b$="")
    A = GetKey()
    If A > 31 Then Name$ = Name$ + Chr$(A)
    If (A=8) And Len(Name$)>0 Then Name$ = Left$(Name$,Len(Name$)-1)
    Text 150,100,Name$ + "_"
    Return Name$
End Function

tft

BeitragSa, Aug 02, 2008 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi....

die SubRutinen gehören nicht in die Haubtschleife. Das Return in der Hauptschleife beändet das Programm.

Code: [AUSKLAPPEN]

;Hauptschleife
.Hauptschleife
Repeat
;Eingaben Auswerten
If KeyDown(60) Then
  Repeat
    LevelNr$ = Input(100,100,LevelNr)
    Gosub Anzeigen
  Until KeyDown(28)
  Gosub LadeLevel
EndIf


Until KeyDown(1)

end

;Ausgabe
.Anzeigen
Hier sollen Später die Anzeigen hinkommen
Return

TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Silver_Knee

BeitragSa, Aug 02, 2008 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Return springst du immer einen Sub nach oben...:

Code: [AUSKLAPPEN]
Gosub bla1
Return

.Bla1

Gosub bla2

Return


.bla2

Return


Das strukturiert dein Programm wie folgt:
Code: [AUSKLAPPEN]
+<Hauptprogram>
+-+bla1
|  +-+bla2
| |  |


Immer wenn ein Programm bei dem Return ankommt springt es eine Ebene nach oben... das geht solange gut bis du ihm sagst "Springe von der Hauptprogrammebene eine hoch" Das beendet nunmal dein programm.
 

nebelhorn

BeitragSa, Aug 02, 2008 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha, vielen Dank für die schnelle Antwort!
Das hatte ich in keiner Hilfe gefunden, da stand immer nur "erzeugt keine Fehlermeldung".

tft

BeitragSo, Aug 03, 2008 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ---

bei Blitz haste zumindest nicht das Problem. Das bei einem solchen Fehler das System einen MAV erzeugt.

gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Smily

BeitragSo, Aug 03, 2008 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
...am besten solltest du dir goto und gosub aber wieder ganz schnell abgewöhnen Wink Die sind nämlich böse.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

tft

BeitragSo, Aug 03, 2008 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ...

Böse???? ich würde eher antiquirt sagen. Ich nutze es trotzdem. Hatte noch nie Probleme damit.

Gruss TFT

PS: Wenn man folgende dinge beachtet.

1. Nicht aus For Next Schleifen mit Goto raus. Dazu nimmt man Exit.
2. Kein Goto aus Functionen herraus. Böse !!!!
3. Kein Goto aus einem Einsprung in eine SubRutine die mit Gosub angesprungen wurde. Das gibt verwirrung..........

In grossen und ganzen gibt es einiges zu beachten. ........

Also dann lieber kein Goto .........
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

FireballFlame

BeitragSo, Aug 03, 2008 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
tft hat Folgendes geschrieben:
1. Nicht aus For Next Schleifen mit Goto raus. Dazu nimmt man Exit.

Huh, gerade das ist bei mir aber einer der Hauptanwendungszwecke für Goto...

Wenn ich irgendwo drei ineinanderverschachtelte Schleifen habe, (z.B. For-Each-Schleifen, zwecks Suche nach einem Objekt, die beim ersten Fund abbrechen soll), dann schreibe ich lieber einmal Goto als dreimal Exit.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

tft

BeitragSa, Aug 09, 2008 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi....

sicher funktioniert das..... Aber das sorgt gelegentlich für komische effecte beim abarbeiten des Code. Da werden dann Code Teile ausgefürt. Die da nicht hingehören. Das muss mit dem Compiler zusammenhängen. Hatte da schon einige schlaflose Nächte wegen solchem mist. Goto .. innerhalb eines bestimmten Blocks und nicht zu weit vom Sprung entfernt funktioniern immer. Aber sobald mann das ganze zu extrem macht. Und dabei aus Schleifen springt. Gibts manchmal unerklärliches verhalten.

If x=1 to 100
if y=1 to 100
if z=1 to 100
c=1
if y=5 And z=7 Then Exit
c=0
next
if c=1 then Exit
next
if c=1 then exit
next

Es gibt natürlich auch andere Möglichkeiten das zu lösen.

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

BtbN

BeitragSa, Aug 09, 2008 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibts in BB keine LoopLabels?

tft

BeitragMi, Aug 13, 2008 10:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ...

wie meinst du das ?
Labes sind Labels, die können mit Goto geloopt sein.

.Main

Code

Goto Main

Aber allgemein benutzt man dazu

Repeat

Code

Forever

Da man aber meist eine Abbruchbedingung benötigt. Wird

Repeat

Code

Until KeyHit(1)

oder änliches verwendet.

Es gibt natürlich auch While/Wend Schleifen. Genaueres gibts in der Hilfe nachzulesen.

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

BtbN

BeitragMi, Aug 13, 2008 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
#Loop2
For Local x:Int = 0 Until 128
    For Local y:Int = 0 Until 128
        If map[x,y] = 15 Then Exit Loop2
    Next
Next


So kenne ich das aus BMax

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group