Referenz - SUB
Syntax:
[{PRIVATE | PUBLIC }] SUB Subname [Aufrufkonvention] [ALIAS "AliasName"] _
[OVERLOAD] ([Parameterliste]) [{CONSTRUCTOR | DESTRUCTOR}] [STATIC] [EXPORT]
' Anweisungen
END SUB
Typ: Prozedur
Kategorie: Programmablauf
Anmerkung zur Syntax: Unterstriche (_) am Zeilenende werden von FreeBASIC so interpretiert, als wäre die Zeile nicht unterbrochen; dies dient nur der besseren Übersichtlichkeit und hat letztendlich keine Auswirkungen auf die Programmausführung.
SUB definiert ein Unterprogramm. Ein Unterprogramm besteht aus normalen Anweisungen und folgt denselben Regeln wie der Code auf Modulebene (dem Code außerhalb eines Unterprogramms).
- Die Klausel 'PRIVATE' bewirkt, dass das Unterprogramm nur aus dem Modul heraus aufgerufen werden kann, in dem es sich befindet. Siehe dazu die Referenzeinträge PRIVATE und PUBLIC.
- 'Subname' ist der Bezeichner, unter dem die SUB aufgerufen wird.
- 'Aufrufkonvention' ist ein Schlüsselwort, das angibt, in welcher Reihenfolge die Parameter übergeben werden sollen. Möglich sind: STDCALL, CDECL und PASCAL.
- 'ALIAS' gibt einer Prozedur in einer Library einen neuen Namen, mit dem man auf sie verweisen kann.
- 'OVERLOAD' erlaubt, Prozeduren mit unterschiedlicher Parameterliste, aber gleichem Subnamen zu deklarieren. Siehe dazu den Referenzeintrag OVERLOAD.
- 'Parameterliste' gibt die Parameter an, die an das Unterprogramm übergeben werden. Die Parameterübergabe wird weiter unten erläutert.
- Die Klausel 'CONSTRUCTOR und DESTRUCTOR bewirken, dass eine SUB aufgerufen wird, bevor das Programm gestartet wird bzw. nachdem es beendet wurde. Siehe dazu CONSTRUCTOR (Module) und DESTRUCTOR (Module). CONSTRUCTOR/DESTRUCTOR-SUBs dürfen keine Parameter besitzen.
- Die Klausel 'STATIC' bewirkt, dass alle Variablen innerhalb des Unterprogramms zwischengespeichert werden. Das bedeutet, dass die Werte von Variablen, die in der Sub verwendet werden, nach einem Aufruf nicht verloren gehen, sondern beim nächsten Aufruf der Sub wieder verfügbar sind. Siehe auch STATIC (Klausel).
- Die Klausel 'EXPORT' bewirkt, dass das Unterprogramm zur PUBLIC-EXPORT-Tabelle hinzugefügt wird, sodass sie von externen Programmen aus mit DYLIBSYMBOL verlinkt werden kann. Siehe dazu den Referenzeintrag EXPORT.
Um ein Unterprogramm aufzurufen, bevor es im Quellcode definiert wurde, muss es zuvor deklariert werden:
DECLARE SUB Subname [Aufrufkonvention] [OVERLOAD] [[LIB "DLLName"] _
ALIAS "AliasName"] [ ( Parameterliste ) ] [{CONSTRUCTOR | DESTRUCTOR}]
Siehe dazu den Referenzeintrag DECLARE
Der SUB-Code kann aus jeder Programmsituation heraus aufgerufen werden, d. h. beim Aufruf der SUB wird ihr Code ausgeführt. Dadurch ist es möglich, ein Programm übersichtlich zu gestalten, da immer wiederkehrende Aufgaben in eine SUB 'ausgelagert' und mittels nur einer einzigen Programmzeile ausgeführt werden können.
Parameterübergabe
Der vom Unterprogramm ausgeführte Code kann von übergebenen Parametern abhängig sein. Die Parameterliste besitzt die Form
[ {BYVAL | BYREF } ] [Parameter1] AS [CONST] Typ [= Wert] [, _
[ {BYVAL | BYREF } ] [Parameter2] AS [CONST] Typ [= Wert] ] [, ...]
- 'Parameter1', 'Parameter2', ... sind die Parameter (auch Argumente genannt). Es sind Variablen (bzw. ihre Werte), die im Unterprogramm verwendet werden können.
- Wird 'CONST' angegeben, kann der Wert innerhalb des Unterprogramms zwar gelesen, aber nicht mehr beschrieben werden.
- 'Typ' ist der Datentyp des übergebenen Parameters. Auch UDTs und Pointer können verwendet werden.
- Durch '= Wert' wird ein Parameter als optional deklariert; er kann beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird an die Funktion für diesen Parameter 'Wert' übergeben. Das VisualBASIC-Äquivalent heißt OPTIONAL.
- BYVAL und BYREF regeln die Art der Parameterübergabe an das Unterprogramm.
Der Datentyp muss bei den Parametern immer angegeben werden.
Siehe auch Parameterübergabe.
Aufgerufen wird ein Unterprogramm über seinen Bezeichner. Fügen Sie in Ihrem Code einfach eine Zeile mit dem Bezeichner der SUB ein, so als wäre dieser Bezeichner eine Anweisung. Ein solcher Aufruf darf an jeder Stelle im Programm erfolgen, auch wenn sich das Programm bereits auf Prozedurebene (also innerhalb einer SUB, FUNCTION, PROPERTY oder einem OPERATOR) befindet.
Hinweis: Früher wurde der Befehl CALL verwendet, um eine SUB aufzurufen. Dieser Befehl ist aber in der Dialektform -lang fb (Standard) nicht mehr zulässig.
Die im Hauptprogramm verwendeten Variablen sind in Prozeduren nicht verfügbar. Um auf sie dennoch zuzugreifen, müssen sie zuerst in der Parameterliste übergeben werden. Bei einer SUB (oder Prozeduren allgemein) handelt es sich um SCOPE-Blöcke. Das bedeutet, dass Variablen, die auf SUB-Ebene dimensioniert werden, auf Modulebene nicht verfügbar sind. Siehe auch Gültigkeitsbereich von Variablen.
Beispiel: farbigen Text mittels einer SUB ausgeben:
DECLARE SUB colortext (txt AS STRING, clr AS INTEGER)
DIM i AS INTEGER
colortext "blue" , 1
colortext "green", 2
colortext "red" , 4
PRINT
FOR i = 1 TO 15
colortext "COLOR " & i, i
NEXT
SLEEP
'--------------------------------------------------'
SUB colortext (txt AS STRING, clr AS INTEGER)
COLOR clr
PRINT txt
END SUB
Unterschiede zu QB:
- Parameter können in FreeBASIC optional sein.
- In FreeBASIC kann eine SUB auch mit RETURN verlassen werden.
- SUBs können in FreeBASIC überladen werden.
Unterschiede zu früheren Versionen von FreeBASIC:
- Bis FreeBASIC v0.17 war es auch zulässig, das STATIC-Schlüsselwort links vom Prozedur-Header zu platzieren; seit v0.17 allerdings ist die Form STATIC SUB Name ungültig.
- Seit FreeBASIC v0.17 ist es zulässig, auf Prozedurebene (z. B. innerhalb einer SUB) TYPEs, UNIONs und ENUMs zu erstellen.
- Seit FreeBASIC v0.16 ist es zulässig, Arrays undefinierter Größe auch innerhalb von SUBs zu definieren. (z. B. DIM AS INTEGER foo().)
- Seit FreeBASIC v0.16 wird RETURN in SUBs als Shortcut für EXIT SUB eingesetzt. Damit verbunden ist, dass GOSUB und ON ... GOSUB nicht mehr auf Prozedurebene eingesetzt werden können.
- Das Überladen einer SUB ist seit FreeBASIC v0.14 möglich; siehe OVERLOAD.
- Variable Argumente sind seit FreeBASIC v0.13 möglich; siehe VA_ARG.
- Seit FreeBASIC v0.13 können optionale Parameter auch bei Strings eingesetzt werden.
- Seit FreeBASIC v0.12 müssen in den DECLARE-Zeilen keine Parameter-Namen mehr genannt werden; es ist jedoch immer noch zulässig.
Unterschiede unter den FB-Dialektformen:
- In der Dialektform -lang fb werden Parameter standardmäßig BYVAL übergeben. In den Dialektformen -lang qb und -lang fblite ist die Standardübergabe BYREF. Siehe die zugehörigen Referenzeinträge für genauere Informationen.
- In den Dialektformen -lang qb und -lang fblite kann RETURN nur eingesetzt werden, wenn OPTION GOSUB ausgeschalten ist. In der Dialektform -lang qb muss dies explizit durch OPTION NOGOSUB festgelegt werden.
Siehe auch:
FUNCTION, PROPERTY, DECLARE, OVERLOAD, STATIC (Klausel), EXIT, END, BYVAL, BYREF, SHARED, PRIVATE (Klausel), PUBLIC (Klausel), OPTION, CONSTRUCTOR, DESTRUCTOR (Module), Prozeduren, Parameterübergabe
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|