|
Bugfixes am Forum
Subdomains aktiviert
Counterscript entfernt
|
| |
|
|
Referenzhandbuch |
|
|
Referenzhandbuch
|
Kapitel 11
|
Programmablauf
Der Programmablauf (die Abarbeitung der einzelnen Programmanweisungen) wird durch die Reihenfolge der Anweisungen bestimmt.
Normalerweise erfolgt die Abarbeitung des Programms nacheinander von der ersten bis zur letzten Anweisung und zwar von oben
nach unten. Diese Reihenfolge kann aber von Ihnen unterbrochen und gesteuert werden. Im folgenden Kapitel lernen Sie die
Befehle und Anweisungen kennen, die es Ihnen ermöglichen, bestimmte Punkte im Programm gezielt aufzurufen und so den
Programmablauf zu beeinflussen.
Befehl: Goto
Syntax: Goto Programmlabel
Modus: Amiga/Blitz
Springt direkt zu einem mit Label näher bestimmten Programmpunkt. (Sollte heute nur
noch in Ausnahmefällen benutzt werden.) Erlaubt das Überspringen von Programmabschnitten.
Befehl: Gosub
Syntax: Gosub Programmlabel
Modus: Amiga/Blitz
Springt zur Unterroutine, die mit Label näher bestimmt wird. Die Unterroutine muß
mit einem Return beendet werden. Nach Beendigung der Unterroutine wird das Programm in der Zeile
nach dem Gosub-Befehl fortgesetzt. Die Rücksprungadresse wird auf einem speziellen Stack
zwischengespeichert und nach der Ausführung von Return wieder gelöscht. Dies erlaubt den
Aufruf des Programmabschnittes von vielen Punkten im Programm. Eine Verschachtelung ist möglich.
Beispiel:
Gosub zwei
NPrint "drei"
MouseWait
End
zwei:
Gosub eins
NPrint "zwei"
Return
eins:
NPrint "eins"
Return
siehe auch: Return
Befehl: Return
Syntax: Return
Modus: Amiga/Blitz
Return wird benötigt, um nach einem Gosub aus der Unterroutine
wieder zurückzuspringen. Nach Return wird das Programm mit der Zeile nach dem entsprechenden
Gosub-Aufruf fortgesetzt.
siehe auch: Gosub
Befehl: On...Goto/Gosub
Syntax: On Wert/Berechnung Goto/Gosub Programmlabel [, Programmlabel...]
Modus: Amiga/Blitz
Verzweigt in Verbindung von Goto oder Gosub zahlenwertabhängig zu
Label einer Labelliste. Ist der Wert 1 springt das Programm zum
1. Label, ist der Wert 2 zum 2. Label und so weiter. On 2 Goto
test1, test2 würde zu test2 (2. Label) verzweigen. Ist
Wert kleiner 1 oder sind nicht genug Labels angegeben, wird die
Zeile nach On ausgeführt.
Beispiel:
For k=1 To 3
On k Gosub eins,zwei,drei
Next
NPrint "Zurück zum Editor mit Mausklick..."
MouseWait
End
eins:
NPrint "eins"
Return
zwei:
NPrint "zwei"
Return
drei:
NPrint "drei"
Return
siehe auch: Gosub, Goto, Return
Befehl: MouseWait
Syntax: MouseWait
Modus: Amiga/Blitz
Hält ein Programm an, bis die linke Maustaste gedrückt wird. Sollte nur beim Austesten von
Programmen benutzt werden, weil das Multitasking verlangsamt wird.
Beispiel:
Nprint "Warte auf Mausklick..."
MouseWait
Befehl: End
Syntax: End
Modus: Amiga/Blitz
Beendet ein Programm komplett. Wenn Sie das Programm vom Editor aus gestartet haben, befinden Sie sich nach
End wieder im TED; wenn Sie das Programm als ausführbares Programm gestartet haben,
kommen Sie zurück zum CLI oder zur Workbench.
Beispiel:
Gosub drei
MouseWait
End
drei:
Nprint "Hallo"
Return
siehe auch: Stop
Befehl: Stop
Syntax: Stop
Modus: Amiga/Blitz
Hält ein Programm an und ermöglicht dem Anwender die Programmkontrolle im Direktmodus. Mit
Cont wird das Programm fortgesetzt. Nur bei der Fehlersuche von Bedeutung, um z.B. Variablen zu
überprüfen.
Beispiel:
a=10
NPrint "Betätigen Sie die linke Maustaste und geben Sie `NPrint a` ein"
MouseWait
Stop
siehe auch: Cont, End
Befehl: Cont
Syntax: Cont [N]
Modus: Amiga/Blitz
Der Cont-Befehl ist nur im Blitz2-Direktmodus erreichbar. Cont setzt ein
mit Stop oder durch einen Fehler angehaltenes Programm fort. Der optionale (also nicht unbedingt
anzugebene) Parameter N kann benutzt werden, um eine Anzahl von Stop-Befehlen
nach Cont zu ignorieren. Dies ist sinnvoll bei der Fehlersuche in Schleifen. Der Programmablauf wird so
nicht bei jedem Schleifendurchlauf angehalten.
siehe auch: Stop
Befehl: If
Syntax: If Wert/Bedingung/Vergleich [Then...]
Modus: Amiga/Blitz
Mit If kann bedingungsabhängig in verschiedenen Programmabschnitten verzweigt werden. Ist die
Bedingung erfüllt, dann wird die Anweisung hinter Then oder ein If
-Block ausgeführt. Ist Bedingung nicht wahr, wird die nächste Anweisung oder die
Anweisung nach EndIf ausgeführt. Als Vergleich stehen Ihnen
=, <, >,
<>, <=, >=
zur Verfügung.
= | gleich |
< | kleiner |
> | größer |
<> | ungleich |
<= | kleiner oder gleich |
>= | größer oder gleich |
Folgt dem If kein Then, dann wird ein If
-Block gebildet. Ein If-Block muß mit EndIf abgeschlossen werden.
Alle Anweisungen innerhalb des If-Blocks werden bei Bedingung ist wahr
ausgeführt. Else ermöglicht es, bei Bedingung nicht wahr
eine alternative Anweisung aufzurufen.
Beispiel:
For k = 1 To 10
If k = 5 Then NPrint "k ist 5!"
If k < 5
NPrint "k ist kleiner als 5!"
Else
NPrint "k ist nicht kleiner als 5!"
EndIf
Next
MouseWait
End
siehe auch: Else, EndIf
Befehl: EndIf
Syntax: EndIf
Modus: Amiga/Blitz
EndIf beendet einen If-Block. Mehr Informationen hierzu unter
If.
siehe auch: If, Else
Befehl: Else
Syntax: Else [Anweisung...]
Modus: Amiga/Blitz
Else wird benutzt, um bei einen unwahren If-Vergleich in einen
alternativen Programmabschnitt zu verzweigen.
Beispiel:
NPrint "Geben Sie eine Zahl von 1-10 ein"
a=Edit(3)
If a<5
NPrint "Deine Zahl ist kleiner 5"
Else
NPrint "Deine Zahl ist größer oder gleich 5"
EndIf
MouseWait
End
siehe auch: If, EndIf
Befehl: While
Syntax: While Bedingung/Vergleich
Modus: Amiga/Blitz
While bildet in Verbindung mit Wend eine Schleife. Die Anweisungen zwischen
While und Wend werden solange wiederholt, bis der Vergleich nicht mehr wahr
ist. Tritt dieser Fall ein, wird die Anweisung nach Wend ausgeführt.
While a<10 (Bei 10 oder größer wird die
(Anweisungen) Schleife abgebrochen und die Anweisung
Wend hinter WEND ausgeführt)
Beispiel:
While a<10
NPrint a
a+1
Wend
MouseWait
End
siehe auch: Wend, Repeat
Befehl: Wend
Syntax: Wend
Modus: Amiga/Blitz
Wend wird in Verbindung mit While verwendet. Weitere Informationen
unter While.
siehe auch: While
Befehl: Select
Syntax: Select Wert
Modus: Amiga/Blitz
Select ermöglicht eine von Wert abhängige Verzweigung.
Select benötigt Case und End Select,
bisweilen auch Default.
Beispiel:
Print "Gib eine Zahl von 1-3 ein"
n=Edit(80)
Select n
Case 1
NPrint "1"
Case 2
NPrint "2"
Case 3
NPrint "3"
Default
NPrint "Zahl ist nicht 1, 2 oder 3!"
End Select
MouseWait
End
siehe auch: Case, End Select, Default
Befehl: Case
Syntax: Case Wert/String
Modus: Amiga/Blitz
Case folgt einer Select-Anweisung, um einen Programmcodeabschnitt auszuführen,
wenn (und NUR wenn) der Wert der Case-Anweisung dem Select-Auswahlwert
entspricht. Entspricht kein Case-Wert dem Select-Wert, werden die Anweisungen nach
Default oder nach End Select ausgeführt. Eine Nutzung von Strings ist
möglich.
siehe auch: Select, Default, End Select
Befehl: Default
Syntax: Default
Modus: Amiga/Blitz
Default wird ausgeführt, wenn keine Case-Anweisung ausgeführt werden
konnte.
siehe auch: Case, Select, End Select
Befehl: End Select
Syntax: End Select
Modus: Amiga/Blitz
Beendet eine Select-Case-End-Schleife, wenn keine Case-Anweisung ausgeführt
werden konnte. Das Programm wird mit der Anweisung hinter End Select fortgesetzt.
siehe auch: Select, Case, Default
Befehl: For
Syntax: For Var=Wert1 To Wert2 [Step Wert3]
Modus: Amiga/Blitz
Der For-Befehl eröffnet eine For...Next-Schleife. Die Variable
Var nimmt Wert1 an und wird durch Next
bis zu Wert2 um 1 erhöht. Wird Step Wert3 mit angegeben,
erhöht sich Var je Durchlauf um den angegeben Wert3. Wird ein
negativer Wert3 benutzt, vermindert sich Var um den angegebenen
Wert3. Hierfür sollte Wert1 größer
Wert2 sein. Voreingestellt ist Step 1. Erreicht oder
überschreitet Var Wert2, so wird die Schleife beendet.
Beispiel:
For a = 1 To 3
For b = 3 To 1 Step -1
NPrint "a=",a,"b=",b
Next
Next
siehe auch: Next, Step
Befehl: Next
Syntax: Next [Var[,Var...]]
Modus: Amiga/Blitz
Next beendet eine For-Next-Schleife. Weitere Informationen unter
For. Var ist optional und sollte nur zu Übersichtszwecken
angegeben werden.
Befehl: Repeat
Syntax: Repeat
Modus: Amiga/Blitz
Mit Repeat beginnt eine Repeat/Until-Schleife. Repeat
benötigt im weiteren Programmablauf einen Until-Befehl als Schleifenendkennung. Der Programmabschnitt
innerhalb dieser Schleife wird immer mindestens einmal durchlaufen. Die Überprüfung auf wahr oder unwahr einer Bedingung
erfolgt erst mit dem Until Befehl.
Beispiel:
Repeat
Print "Geben Sie eine Zahl ein (0=beenden)"
n=Edit(80)
If n/2=Int(n/2)
NPrint n," ist eine gerade Zahl"
Else
NPrint n," ist eine ungerade Zahl"
EndIf
Until n=0
siehe auch: Until, Forever
Befehl: Until
Syntax: Until Bedingung/Vergleich
Modus: Amiga/Blitz
Until wiederholt eine mit Repeat eröffnete Schleife solange, bis
Bedingung nicht erfüllt (0) ist. Ist
Bedingung erfüllt (nicht 0), dann wird das Programm mit der Anweisung nach Until fortgesetzt.
Beispiel:
Repeat
(Schleifen-Anweisungen)
Until a=0
siehe auch: Repeat, Forever
Befehl: Forever
Syntax: Forever
Modus: Amiga/Blitz
Macht eine Repeat-Schleife zur Endlosschleife. Forever entspricht
Until 0.
siehe auch: Repeat, Until
Befehl: Pop
Syntax: Pop Gosub/For/Select/If/While/Repeat
Modus: Amiga/Blitz
Pop ermöglicht den Abbruch einer Schleife vor ihrer ordnungsgemäßen Beendigung.
Pop löscht die Schleife vom Stack und erklärt Sie als beendet. Sie sollten niemals
eine Schleife vorzeitig verlassen, ohne Pop anzuwenden. (Normalerweise sollten Sie eine Schleife
eigentlich nie vorzeitig verlassen.)
Beispiel:
Repeat
NPrint "Denk Dir eine Zahl zwischen 1 und 1000..."
NPrint "Ich werde sie in 10 Versuchen herausfinden!"
k=0:g=1000
For v=1 To 10
z=Int((g-k)/2)+k
Repeat
Print "Ist deine Zahl ",z,"? (j)a, (g)rößer, (k)leiner ?"
a$=LCase$(Edit(1))
Until A$="j" OR A$="g" OR A$="k"
Select a$
Case "j"
NPrint "Ich habe es in ",v," Versuchen geschafft!"
NPrint "Schlau, nicht wahr ?"
Pop Select:Pop For
Goto richtig
Case "k"
g=z
Case "g"
k=z
End Select
Next
NPrint "Nanu??? Du mußt Mist gemacht haben!"
richtig:
Print "Ein neues Spiel ? (j)a, (n)ein ?"
a$=LCase$(Edit$(1))
Until a$="n"
End
Befehl: Set Int
Syntax: Set Int Typ
Modus: Amiga/Blitz
Erklärt einen Teil Ihres Programms als "Interruptcode". Bevor wir uns weiteren Details des SetInt
-Befehls widmen, sehen wir uns kurz an, was Interrupts sind.
Wenn ein Programm abläuft, muß oft geprüft werden, ob bestimmte Ereignisse eingetreten sind. Dies erfolgt per Interrupts.
Wenn ein Interrupt ausgelöst wurde, wird das gerade laufende Programm durch den 68000 komplett angehalten. Das Programm erkennt,
daß eine Interrupt-übergabe erfolgte. Sobald die Interruptroutine ihre Arbeit beendet hat, wird das angehaltene Programm
fortgesetzt.
Was kann einen Interrupt auslösen ?
Es gibt 14 unterschiedliche Arten von möglichen Interrupts für den Amiga. Sie sind mit entsprechenden Nummern gekennzeichnet
(Typ).
Interrupt | Grund des Interrupts |
0 | Serieller Puffer ist leer |
1 | Disk Block lesen/schreiben |
2 | Software Interrupt |
3 | CIA Ports Interrupt |
4 | Copper Interrupt |
5 | Vertical Blank |
6 | Blitter ist fertig |
7 | Audio Kanal 0 |
8 | Audio Kanal 1 |
9 | Audio Kanal 2 |
10 | Audio Kanal 3 |
11 | Serieller Puffer voll |
12 | Floppy Disk Sync |
13 | Externer Interrupt |
Ein oft benutzter Interrupt ist der Vertical Blank Interrupt. Er wird ausgelöst, wenn das Videobild (Monitorbild) komplett aufgebaut
ist. Dies ist jede 50stel Sekunde der Fall. Für Animationsangleichungen ist dieser Interrupt sehr nützlich. Wird ein
Programmabschnitt als Vertical Blank Interrupt angelegt, wird dieser Programmabschnitt alle 50stel Sekunde ausgeführt. Der
Programmabschnitt muß so schnell wie möglich abgearbeitet werden. Auf keinen Fall darf die Ausführung länger als eine
50stel Sekunde dauern. Strings dürfen nicht verwendet werden. Im Amigamodus können keine Blitter-, Intution- oder File I/O-Kommandos
im Interrupt-Handler ausgeführt werden. Möchten Sie einen Programmabschnitt als Interrupt-Handler benutzen, mußdieser
Abschnitt dem SetInt-Befehl folgen. Das Ende des Interruptcodes wird mit End SetInt festgelegt. Der
Typ-Parameter legt den Interrupt fest, den Sie nutzen möchten. Er entspricht den Nummern der obigen
Tabelle.
Z.B.: SetInt 5 benutzt den Vertical Blank Interrupt.
Beispiel:
SetInt 5 ;Es folgt ein Vertical Blank Handler..
a+1 ;a um eins erhöhen
Poke.w $dff180,a ;Dieser kleine Poke ändert die Hintergrundfarbe
End SetInt ;Ende des Interrupt-Handlers
MouseWait ;wartet auf Mausklick - der Handler arbeitet derweil fleißig weiter
End
siehe auch: End SetInt, ClrInt
Befehl: End SetInt
Syntax: End SetInt
Modus: Amiga/Blitz
End SetInt kennzeichnet das Ende eines Interruptprogrammabschnittes. Weitere Informationen unter
SetInt.
siehe auch: SetInt, ClrInt
Befehl: ClrInt
Syntax: ClrInt Typ
Modus: Amiga/Blitz
Alle mit SetInt initalisierten Interrupthandler mit Typ-Nummer werden nicht
mehr ausgeführt.
Beispiel:
SetInt 5 ;Beginn Interrupt-Handler
a+1
Poke.w $dff180,a
End SetInt ;Ende des Interruptcodes
NPrint "Drücke RETURN..." ;Der Handler arbeitet bis
b=Edit(1) ;die Returntaste gedückt wird.
ClrInt 5 ;Schaltet den Handler ab.
NPrint "Drücke Maustaste!"
MouseWait
siehe auch: SetInt, End SetInt, Return
Befehl: SetErr
Syntax: SetErr
Modus: Amiga/Blitz
Der Code nach SetErr wird bei einem Runtime Error im AB2-Programm ausgeführt. Sie können hier eine
Fehlerbearbeitung nach eigenen Vorstellungen entwerfen. Das Ende des Handlers wird mit End SetErr festgelegt.
Beispiel:
SetErr ;Fehlerroutine installieren
NPrint "PROGRAMMFEHLER!" ;das ist unser Handler
NPrint "Maustaste drücken!"
MouseWait
ErrFail
End SetErr ;Ende des Handler
Dim a(10) ;ein Array dimensionieren
For k=1 To 11 ;einen Fehler auslösen
a(k)=k:NPrint a(k)
Next
siehe auch: ErrFail, ClrErr
Befehl: End SetErr
Syntax: End SetErr
Modus: Amiga/Blitz
Kennzeichnet das Ende einer Fehlerroutine, die mit SetErr installiert wurde. Weitere Informationen unter
SetErr.
siehe auch: SetErr, ClrErr, ErrFail
Befehl: ClrErr
Syntax: ClrErr
Modus: Amiga/Blitz
Macht Ihre mit SetErr aktivierte Fehlerroutine inaktiv.
siehe auch: SetErr, ErrFail, End SetErr
Befehl: ErrFail
Syntax: ErrFail
Modus: Amiga/Blitz
ErrFail überträgt einen Fehler aus einer Fehlerroutine in den Direktmodus von AB2 und zeigt Ihn an.
siehe auch: SetErr, ClrErr
Befehl: VWait
Syntax: VWait [Anzahl Vertical Blanks]
Modus: Amiga/Blitz
VWait wartet auf den nächsten Vertical Blank. Wird Anzahl Vertical Blanks
mitangegeben, wartet das Programm diese Anzahl von Vertical Blanks. VWait ermöglicht die
Synchronisierung von Animationen an die Bildwiederholfrequenz des Monitors. Beachten sollten Sie, daß die Frequenzen bei NTSC- und
PAL-Amiga unterschiedlich sind (NTSC 60stel Sekunde / PAL 50stel Sek.).
|
|
|
|
|
|