Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Anfängerkurs Teil 3 - Kontrollstrukturen: Bedingungen, Schleifen usw.

von RedakteurytwinkySeite 2 von 4

Nachdem wir nun wissen, wie Schleifen aufgebaut sind und wie sie abgearbeitet werden, interessiert uns eins natürlich brennend: Muß ich denn eine Schleife jedesmal bis zum (bitteren) Ende ausführen?
Nun, das war 'früher' so, ganz Findige behalfen sich mit einer Goto/Label-Konstruktion:

For i As Integer=1 To irgendwas
  If Wert>Testwert Then Goto SchleifenAusgang
  Wert+=i*Wert
Next
SchleifenAusgang:

So eine Schleife hat natürlich(wie der Goto-Befehl sowieso)keinen sittlichen Nährwert und ist auch nur ein einfaches Beispiel dafür, wie es auch geht..
Aber der Labelname '..Ausgang' erinnert uns an etwas: Ausgang heißt auf englisch Exit. Na, das ist uns doch beim Stöbern in der Referenz schon mal begegnet..
Der Exit-Befehl verläßt sofort den aktuellen Block. Das kann nun eine Sub/Function sein oder eine Schleife(Do..Loop, While..Wend, For..Next).
Die manchmal erwähnte If-Schleife taucht hier gar nicht auf? Wieso nicht? Ganz einfach, weil die If-Anweisung keine Schleife ist. Sie wird ja nur ausgeführt, wenn eine Bedingung erfüllt ist oder nicht oder wie auch immer..
Jedenfalls wird dort nichts wiederholt, es sei denn die If-Anweisung befindet sich in einer Schleife, aber dann könnte ja jede Anweisung in der Schleife eine Schleifenanweisung sein und das wäre wirklich mehr als nicht ganz richtig ;-))
Wenn wir also in unserer Schleife ein Exit einbauen, meckert der fbc natürlich, da er ja nicht weiß, was denn nun verlassen werden soll, aber das können wir ihm ja mitteilen. Wobei als Merkregel gelten kann, daß immer der Schleifenstartbefehl verlassen wird.
Richtig sind also: 'Exit For', 'Exit While' und 'Exit Do'. ('Exit Next', 'Exit Wend' oder 'Exit Loop' sind einfach verkehrt..)
Obiges Beispiel mal mit Exit sähe so aus:

For i As Integer=1 To irgendwas
If Wert>Testwert Then Exit For
Wert+=i*Wert
Next

Das sieht doch schon viel eleganter aus..
Wie läßt sich eine Schleifenabarbeitung denn noch beschleunigen? Falls in einer Schleife Werte eingelesen werden, kann es vorkommen, daß nur bestimmte Werte auch bearbeitet werden sollen. Wieder erst mal die nicht gern gesehene Goto-Lösung:

'Die Datei ist schon zum Lesen geöffnet
While Not Eof(#Datei) 'noch nicht am Dateiende?
  Line Input #Datei, Zeile ' eine Zeile einlesen..
  If Zeile="" Then Goto Weiter 'Leerzeilen sollen nicht bearbeitet werden
  'hier wäre der Block zum Bearbeiten
  '..
  '
  Weiter:
Wend 'Schleifenende
Close Datei 'ist immer guter Stil, wenn die Dateibearbeitung beendet ist

Hier soll also mit der Abarbeitung der Schleife bei Eintreten einer bestimmten Bedingung weitergemacht werden. Analog zu oben überlegen wir uns, was 'weitermachen' auf Englisch heißt, kommen auf 'Continue' und haben schon wieder einen Grund in der Referenz nachzusehen xD

'Die Datei ist schon zum Lesen geöffnet
While Not Eof(#Datei) 'noch nicht am Dateiende?
  Line Input #Datei, Zeile ' eine Zeile einlesen..
  If Zeile="" Then Continue While 'Leerzeilen sollen nicht bearbeitet werden
  'hier wäre der Block zum Bearbeiten
  '..
  '
Wend 'Schleifenende
Close Datei 'ist immer guter Stil, wenn die Dateibearbeitung beendet ist

Das ist jetzt schon das zweite Beispiel, das zeigt, wie sich die Goto/Label-Konstruktion vermeiden läßt.
In vielen Spielen findet sich nach der Initialisierung des Programms das Label 'Start' in irgendeiner Form und dieses wird dann beim Eintreten bestimmter Bedingungen angesprungen. Das haben wir doch gerade schonmal gelesen..

'Programminitialisierung
'..
Do 'Hauptschleife des Spiels
  '..
  '..
  If Leben<=0 Then Continue Do 'Spiel von vorne beginnen..
  If Status="Gewonnen" Then Exit Do 'Spielende, Tusch, Bildchen etc.
Loop 'diese Endlosschleife muß von einer Exit-Anweisung beendet werden

Klasse, wieder ohne Goto gelöst ;-))

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 09.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 20.10.2008 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen