Schleifen bei Bascom

adelinde

Mitglied
21. Feb. 2009
60
3
8
Hallo zusammen,
hat jemand eine Ahnung, was passiert wenn man Schleifen in Bascom nicht sauber verlässt?

Zum bessern Verständnis:
.
.
.
do
.
.
if ... then goto <sub> (anstatt: exit do)
.
.
loop

oder

For A = 1 To 10
.
if A > 3 then goto <sub> (anstatt: exit for)
Next A

Gruß Siggi
 
Hi Siggi,

Müll - früher oder später. Warum die Schleifen nicht "sauber" verlassen, wenn's doch möglich ist? Sei doch froh, dass Du mit Bascom strukturiert programmieren kannst. GOTO sollte der Vergangenheit angehören.
Nimm z. B. SELECT...CASE, dann kannst Du mit "GOSUB" oder CALL SUB" sauber Ausscheidungen treffen. Beispiele findest Du im Forum genug.

Grüsse,

Michael
 
Hallo zusammen,
hat jemand eine Ahnung, was passiert wenn man Schleifen in Bascom nicht sauber verlässt?

Hallo Siggi!

Das ist keine Frage von BASCOM oder einer anderen Programmiersprache....

Wenn du mit "Goto" immer durch das Programm springst, läuft dir irgendwann dein Speicher über und der Controller wird stehen bleiben.

Wie Grandpa schon geschrieben hat....
Es gibt genug Möglichkeiten von der Hauptschleife in Submenüs zu springen.... und auch wieder zurück. ;)

Ein wenig solltest du aber schon darauf achten, dass du eine Sub immer mit einem "Return" verlässt!

Gruß,
Cassio
 
Hallo,

Das ist keine Frage von BASCOM oder einer anderen Programmiersprache....

Wenn du mit "Goto" immer durch das Programm springst, läuft dir irgendwann dein Speicher über und der Controller wird stehen bleiben.

Wie Grandpa schon geschrieben hat....
Es gibt genug Möglichkeiten von der Hauptschleife in Submenüs zu springen.... und auch wieder zurück. ;)
sehe ich auch so. Wenn man mit GOTO wild in der Gegend rumspringt kann
man ganz schnell den Überblick verlieren. Vor allem wenn auch noch Interrupts
dazu kommen. Dann passiert es ganz schnell das einem der Stack überläuft
und man weiß nicht wo man den Fehler suchen soll. In Assembler ist das noch
was anderes. Da hat man viele bedingte Sprünge (die IF/THEN/ELSE in den
Hochsprachen) aber in einer Hochsprache sollte man sich die GOTOs
mittlerweile abgewöhnen sonst sieht man irgendwann den Wald vor Bäumen
nicht mehr ;)

Normalerweise gibt es für Schleifen aber auch so etwas wie FOREXIT oder
EXITFOR oder so etwas um eine Schleife über eine Bedingung vor dem
vollständigen Durchlauf zu verlassen. Das ist dann eine andere Sache.
Solche Befehle gibt es auch für andere Schleifen. Dadurch wird aber nur
die Schleife so verlassen als ob sie schon vollständig abgearbeitet wurde.
Es wird also der Befehl hinter der Schleife angesprungen.

Gruß
Dino
 
Danke mal an alle,
das hab ich befürchtet, deshalb ja auch meine Frage.
Ich bin vom Grund auf tippfaul :D
darum wollte ich z.b. folgende Do-Loop direckt mit GOTO Menue_Reset verlassen.
Wenn ich mir Eure Beiträge zu Herzen führe und auf GOTO ganz verzichte, müsste ich im unteren Beispiel mein "Menue_reset" auch mit GOSUB aufrufen?
Das hätte zur Folge, dass ich an ca. 30 Stellen meines Codes ein zusätzliche Zeile RETURN einfügen muss.

Code:
.
.
.
If Taster_6 = 0 Then Exit Do    'Schleife jetzt ordentlich verlassen!

Loop

If Taster_6 = 0 Then
   Bitwait Taster_6 , Set
   [COLOR="Red"]Goto Menue_reset[/COLOR]
   [COLOR="YellowGreen"]Gosub Menue_reset[/COLOR]
End If
.[COLOR="YellowGreen"]Return[/COLOR]
.
.
'------Menue Reset
Menue_reset:
Setfont Font5x5
Cls 
Waitms 20
Taster = 0
Return
 
... darum wollte ich z.b. folgende Do-Loop direckt mit GOTO Menue_Reset verlassen.
In deinem speziellen Beispiel wäre es vollkommen ok, wenn du den IF-Block mit einem Goto verlässt. Allerdings auch vollkommen überflüssig, weil der nächste Befehl sowieso der hinter Menue_reset wäre.

Wenn ich mir Eure Beiträge zu Herzen führe und auf GOTO ganz verzichte, müsste ich im unteren Beispiel mein "Menue_reset" auch mit GOSUB aufrufen?
Das hätte zur Folge, dass ich an ca. 30 Stellen meines Codes ein zusätzliche Zeile RETURN einfügen muss.
Nein, das wäre kontraproduktiv. Die Ausführung des Return würde wieder hinter den Gusob Menue_reset zurückspringen, was du ja wohl nicht willst, oder?

HBA
 
Hallo zusammen,

Wenn ich mir Eure Beiträge zu Herzen führe und auf GOTO ganz verzichte, müsste ich im unteren Beispiel mein "Menue_reset" auch mit GOSUB aufrufen?
Das hätte zur Folge, dass ich an ca. 30 Stellen meines Codes ein zusätzliche Zeile RETURN einfügen muss.
Nein, das wäre kontraproduktiv. Die Ausführung des Return würde wieder hinter den Gusob Menue_reset zurückspringen, was du ja wohl nicht willst, oder?
also im großen und ganzen ...

GOTOs sind eigentlich seit einigen Jahren verpönt als unsauber und unübersichtlich.
das ist so als ob man nen Nagel mit dem Backstein in das Brett haut. Aber
wenn man grade keinen Hammer hat ... :D Warum nicht :rolleyes:
Wenn man weiß was man macht und es gezielt einsetzt ... warum sollte man
dann kein GOTO benutzen ... Man darf sich nur nicht zu unübersichtlichem
Spaghetticode verleiten lassen.

Also in der Kürze ...
Ein GOTO an der richtigen Stelle kann die Arbeit ungemein erleichtern.
Ein GOTO an der falschen Stelle und man rauft sich bei der Fehlersuche die
Haare. Aber man sollte sie sehr sparsam einsetzen!

Gruß
Dino
 
Hallo zusammen!

Ich würde ja auch nicht behaupten wollen, dass "Goto" etwas schlechtes ist.
Letztlich hat jeder Befehl schon so seinen Sinn....
Wie aber Dino schon schrieb, sollte der Befehl mit Bedacht eingesetzt werden.

Ich selber verwende das "Goto" nur, wenn ich innerhalb der selben Subroutine hin und her springen, oder etwas überspringen möchte.
Das Verzweigen in andere Labels habe ich mir abgewöhnt und nutze dafür lieber "Gosub", mit einer entspechenden eigenen Routine und dem zugehörigen "Return".

Grüße,
Cassio
 
Danke an alle,
ich werde mein code nochmal durchsehen und mir Gedanken machen, wie ich in Zukunft damit umgehe.

Gruß Siggi
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)