Ich bin auch der meinung GOTOs sollte man im allgemein vermeiden, es gibt einfach viele situationen wo man keine GOTOs verwenden sollte.
Um 'Schleifen' zu unterbrechen gibt es genug befehle im Bascom um dieses zu tun, wenn man auch Schleifen benutzt.
For I = 1 to 10
#Code
If #Bedingung = TRUE Then Exit For
Next I
While #Bedingung = TRUE
#Code
If #Bedingung2 = TRUE Then Exit While
Wend
diese tolle Funktionen benutzen interne GOTOs mit den man nichts zu tun hat und so auch kaum probleme verursachen
Die IF variante würde so aussehen
Code:
Dim Counter as Byte
Dim Countfrom as Byte
Dim Countto as Byte
Dim Breakbedingung as Bit
'Alias For I = 1 To 10
Countfrom = 1
Countto = 10
Counter = Countfrom
Pseudofor_start:
#Code
If Breakbedingung = 1 Then Goto Pseudofor_end
If Countto > Counter Then
Incr Counter
Goto Pseudofor_start
End If
Pseudofor_end:
Man sollte kein GOTO benutzten bei einem CALL, wo es ein RETI gibt beim rücksprung. Das ist ein Return befehl der die Register wieder herstellt.
Also mit einem Call Befehl werden vorher die Register gespeichert, bei den Return befehl werden die wieder hergestellt, man sollte nicht in ein solchen Bereich rein oder raus springen.
SUB FUNCTION
<-- Hier nicht reinspringen
---> Hier nicht rausspringen mit Goto, Gosub ist ok.
END SUB FUNCTION
On Urxc Onrxd <-- Interruptaufruf wenn 1 Zeichen emfangen wurde(COM).
Hier werden die Register gesichert und nacher zurück geschrieben.
Onrxd:
<-- Mit einem Sprung hier rein überschreibst du die Register mit unbekannte werte
--> Mit einem Sprung hier raus werden die werte nicht wieder hergestellt beim nächsten RETURN
Return <-- Ist ein RETI
Mit GOTOs kann man auch schnell wieder in ein Programmteil landen der dir die Display variablen ändert während du sie gerade übertragst, oder einfach eine Variable ändert die was mit dem Display zu tun hat.
Wenn du z.b. Ein String hast das die erste Zeile deines Displays entspricht, kann es passieren das wenn du vorher noch mit einem Index point ein Byte im String änderst, das dieses zu Fehlern kommen kann. Das kann es passieren, sollte man gerne Variablen doppelt benutzen, das diese in einem anderen Teil des Programs geändert wird, aber beim Display benutzt wird um das Index zu steuern. So kann es passieren das da dann Mühl steht.
Natürlich gibts noch andere möglichkeiten, dafür müsste man aber mehr über das Programm wissen, und auch welche Bascom version du mit welchen Prozessor benutzt.
Vielleicht habe ich dir ja schon so geholfen, sonst kannst dich ja nochmal melden.
Ich benutze GOTOs manchmal um platz zu sparen und die 'AND' und 'OR' funktion zu ersetzen
Code:
Dummerweise sparrt das Platz :(
Statt:
If Var1 = 1 And Var2 = 1 Then
#Code
Else
#Code
End If
If Var1 = 1 Then
If Var2 = 1 Then
#Code
Else
Goto Now_do_else
End If
Else
Now_do_else:
#Code
End If
oder:-
If Var1 = 1 Or Var2 = 1 Then
#Code
Else
#Code
End If
If Var1 = 1 Then
Goto Now_do_if
End If
If Var2 = 1 Then
Now_do_if:
#Code
Else
#Code
End If
Lesezeichen