Benutzerhandbuch
|
Kapitel 4
|
|
Prozeduren
Prozeduren dienen dazu, Programmabschnitte (Routinen) in abgeschlossene Module zu 'verpacken'.
Routinen, die zu Prozeduren verpackt wurden, können vom Hauptprogramm aus aufgerufen
werden, Parameter können übergeben werden und es kann auch ein Wert an das
aufrufende Programm zurückgegeben werden.
Da eine Prozedur ihre eigenen lokalen Variablen verwaltet, kann es keine Verwechslung
zwischen den lokalen Variablen der Prozedur und den Variablen des Hauptprogramms geben.
Ebensowenig kann eine Prozedur die Variablen des Hauptprogramm verändern. Dadurch werden
Prozeduren 'portabel', d.h. sie können in anderen Programmen wiederverwendet werden.
Prozeduren, die einen Wert zurückliefern, werden Funktionen genannt, die anderen
heißen Befehle.
Für Funktionen und Befehle gelten folgende Regeln:
- die Anzahl der Parameter ist auf 6 begrenzt
- Goto- und Gosub-Befehle dürfen nie zu Sprungmarken (Labels) außerhalb der eigenen Prozedur springen
- alle Variablen, die innerhalb der Prozedur verwendet werden, werden bei jedem Aufruf neu initialisiert
Eine Prozedur, die keinen Wert an das aufrufende Programm zurückliefert heißt
in AmiBlitz2-Befehl (engl.: Statement).
Hier ist ein Beispiel einer Befehls-Prozedur, die die Fakultät einer Zahl ausgibt:
Statement fact{n}
a=1
For k=2 To n
a=a*k
Next
NPrint a
End Statement
For k=1 To 5
fact{k}
Next
MouseWait
Sowohl bei der Definition der Prozedur als auch bei deren Aufruf werden die Parameter
in geschweiften Klammern { } eingeschlossen. Die Klammern müssen auch dann angegeben
werden, wenn keine Parameter übergeben werden sollen.
Dieses Programm berechnet die Fakultäten der Zahlen von 1 bis 5 in einer Schleife.
Dabei wird im Hauptprogramm die Variable k als Schleifenindex verwendet. Gleichzeitig wird
in der Prozedur ebenfalls eine Variable mit dem Namen k verwendet. Dies ist deshalb
zulässig, weil die Variable k der Prozedur fact dort lokal vereinbart wurde und
völlig unabhängig von der Variablen k im Hauptprogramm ist. Die Größe
k des Hauptprogramms wird globale Variable genannt.
Es können bis zu sechs Variablen als Parameter an eine Prozedur übergeben werden.
Wenn mehr als sechs Parameter benötigt werden, können diese als spezielle 'shared'
globale Variable vereinbart werden (siehe 'Globale Variablen')
Variablen, die an eine Prozedur als Parameter übergeben werden, dürfen nur
einfache Datentypen sein, NewType-Variablen können nicht übergeben werden. Wohl
aber können Zeiger-Variablen übergeben werden.
AmiBlitz2 erlaubt es auch, Prozeduren zu schreiben, die einen Wert an das Hauptprogramm
zurückliefern. Solche Prozeduren werden Funktionen genannt. Das folgende Beispiel
zeigt dieselbe Prozedur für Fakultäten, diesmal aber als Funktion realisiert:
Function fact{n}
a=1
For k=2 To n
a=a*k
Next
Function Return a
End Function
For k=1 To 5
NPrint fact{k}
Next
MouseWait
Durch die Anweisung Function Return wird das Ergebnis an das Hauptprogramm
zurückgeliefert. Diese Version von fact ist wesentlich nützlicher als die
erste, da das Ergebnis wiederum in beliebigen Ausdrücken verwendet werden kann. Z.B.:
a=fact{k}*fact{j}
Es können alle 6 einfachen Datentypen als Rückgabewert verwendet werden. Um
klarzumachen, welchen Datentyp eine Prozedur zurückgeben soll, wird der
Typ-Zusatz an den Befehl Function angefügt. Ist kein Typ angegeben, wird der
Default-Typ angenommen (normalerweise .q). Im folgenden Beispiel wird ein String
zurückgeliefert:
Function$ leerz{n}
For k=2 To n
a$=a$+" "
Next
Function Return a$
End Function
Print leerz{20}, "Hier drüben"
MouseWait
Der Speicherbereich, der von den lokalen Variablen einer Prozedur belegt wird, ist
nicht nur allein für diese Prozedur reserviert, sondern auch für jeden
Aufruf der Prozedur. Jedesmal, wenn die Prozedur aufgerufen wird, wird auch ein neuer
Speicherbereich angelegt, der erst dann wieder freigegeben wird, wenn die Prozedur
beendet ist.
Dadurch ist es möglich, daß eine Prozedur sich selbst aufrufen kann,
ohne sich dabei die eigenen Daten zu zerstören. Dieses Vorgehen nennt man
Rekursion. Das Programm zur Berechnung der Fakultät ist ein gutes Beispiel
dafür, wie die Rekursion sinnvoll eingesetzt werden kann:
Function fact{n}
If n>2 Then n=n*fact{n-1}
Function Return n
End Function
For k=1 To 5
NPrint fact{k}
Next
MouseWait
Das Prinzip dieses Algorithmus beruht darauf, daß die Fakultät einer Zahl
gerade die Zahl selbst ist, multipliziert mit der Fakultät der um 1 erniedrigten Zahl.
Manchmal ist es notwendig, daß eine Prozedur auch auf die globalen Daten des
Hauptprogramms zugreift. Dies wird mit der Anweisung 'Shared' erreicht, mit der es
möglich ist, bestimmte Variablen innerhalb einer Prozedur als globale Variablen
zu behandeln.
Statement beisp{}
Shared k
NPrint k
End Statement
For k=1 To 5
beisp{}
Next
MouseWait
Durch die Anweisung Shared wird erreicht, daß AmiBlitz2 in der Prozedur
"beisp" keine eigene lokale Variable k anlegt, sondern stattdessen auf die
globale Variable k des Hauptprogramms zugreift. Ohne die Shared-Anweisung wird k zu
einer lokalen Variable und wird somit bei jedem Aufruf von beisp neu initialisiert,
der Wert ist dann jedesmal 0.
AmiBlitz2 unterstützt zwei Arten von Prozeduren: Befehle und Funktionen. Beide
können sowohl eigene lokale Variablen besitzen als auch mit Hilfe der
Shared-Anweisung auf globale Daten zugreifen.
Es können bis zu sechs Parameter an eine Prozedur übergeben werden.
Eine Funktion kann einen der sechs einfachen Datentypen als Wert zurückliefern.