|
Bugfixes am Forum
Subdomains aktiviert
Counterscript entfernt
|
| |
|
|
Benutzerhandbuch |
|
|
Kapitel 4
Prozeduren
·Einleitung
·Befehle
·Funktionen
·Rekursion
·Globale Variablen
·Zusammenfassung
Einleitung
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
Befehle
Eine Prozedur, die keinen Wert an das aufrufende Programm zurückliefert heißt in Blitz2 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 Variabeln')
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.
Funktionen
Blitz2 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
Rekursion
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.
Globale Variablen
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ß Blitz2 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.
Zusammenfassung
Blitz2 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.
|
|
|
|
|
|