Referenz - SELECT CASE
Syntax:
SELECT CASE [AS CONST] Ausdruck
CASE (Ausdrucksliste)
' Code
[CASE (Ausdrucksliste2)
' Code ]
[ ... ]
[CASE ELSE
' Code ]
END SELECT
Typ: Anweisung
Kategorie: Programmablauf
SELECT CASE führt, abhängig vom Wert eines Ausdrucks, bestimmte Codeteile aus.
- 'Ausdruck' ist eine beliebige, aber sinnvolle Aneinanderreihung von Konstanten, Variablen, Operatoren und Funktionen, die einen Zahlenwert oder einen String ergeben. Je nach Wert dieses Ausdrucks wird der Code auf verschiedene Art und Weise fortgesetzt.
- 'Ausdrucksliste', 'Ausdrucksliste2' usw. enthalten ebenso wie 'Ausdruck' Konstanten, Variablen, Operatoren und Funktionen, die einen Wert ergeben. Dabei können pro CASE-Zeile mehrere Ausdrücke und auch Vergleichsoperatoren angegeben werden. Die dazu verwendete Syntax wird weiter unten erläutert. Der Datentyp von 'Ausdrucksliste' muss derselbe sein wie in 'Ausdruck'.
- 'Code' stellt normalen FreeBASIC-Programmcode dar, der unter gegebenen Voraussetzungen (dem Wert von 'Ausdruck' und dessen Verhältnis zu 'Ausdrucksliste') ausgeführt wird.
- Entspricht 'Ausdruck' der ersten 'Ausdrucksliste', so führt FreeBASIC den Code zwischen CASE Ausdrucksliste und CASE Ausdrucksliste2 aus. Ist dies nicht der Fall, prüft FreeBASIC das Verhältnis zwischen 'Ausdruck' und der zweiten, dritten, ... 'Ausdrucksliste', und verfährt dort genauso. Wird keine der angegebenen Bedingungen erfüllt, führt FreeBASIC den Code hinter CASE ELSE aus, sofern diese Zeile existiert. Ansonsten wird gar kein Code ausgeführt und die Programmausführung wird hinter dem SELECT-Block normal fortgesetzt.
- Auch wenn mehrere Bedingungen erfüllt sind, wird immer nur der Code hinter der ersten zutreffenden CASE-Zeile ausgeführt; nachfolgende Bedingungen werden ignoriert.
- Die Klausel 'AS CONST' bewirkt, dass die Abfrage wesentlich schneller durchgeführt wird, schränkt aber die Wahl der Parameter in den Ausdruckslisten ein. Details hierzu sind weiter unten aufgeführt.
SELECT CASE stellt eine etwas übersichtlichere Form dar von:
IF Ausdruck = Ausdrucksliste1 THEN
' Code
[ ELSEIF Ausdruck = Ausdrucksliste2 THEN
' Code ]
[ ... ]
[ ELSE
' Code ]
END IF
Da nicht in jeder Zeile erneut 'Ausdruck =' geschrieben werden muss, erspart sich der Programmierer Tipparbeit. Außerdem ist schneller ersichtlich, welche Bedingung geprüft wird.
Der in 'Ausdruck' bzw. 'Ausdrucksliste' verwendete Datentyp kann eine Ganzzahl (z. B. INTEGER), Gleitkommazahl (z. B. DOUBLE) oder ein STRING, ZSTRING oder WSTRING sein. Nicht zulässig sind hingegen UDTs. UDT-Attribute hingegen dürfen selbstverständlich benutzt werden, sofern sie von einem einfachen Datentyp sind. Siehe dazu auch die FB-Datentypen.
Als Block-Anweisung initialisiert SELECT CASE einen SCOPE-Block, der mit der Zeile END SELECT endet. Variablen, die nach einem 'CASE Ausdrucksliste' deklariert werden, sind nur bis zum Ende des SELECT-Blocks gültig.
SELECT-CASE-Blocks dürfen bis zu einem beliebigen Level ineinander verschachtelt werden.
Syntax einer Ausdrucksliste (hinter CASE):
{ Ausdruck [TO Ausdruck] | IS (Bedingungsoperator) Ausdruck} [, ...]
- 'Ausdruck' ist ebenso wie in SELECT CASE eine sinnvolle Aneinanderreihung von Konstanten, Variablen, Operatoren und Funktionen, die einen Wert ergeben müssen, dessen Datentyp derselbe ist, wie vom Ausdruck in der SELECT-CASE-Zeile vorgegeben.
- Wird nur ein einziger Ausdruck angegeben, so prüft FreeBASIC auf Gleichheit der Werte.
- Sind mehrere Ausdrücke, getrennt durch Kommata angegeben, so prüft FreeBASIC jeden einzelnen davon auf Gleichheit; die Bedingung ist erfüllt, wenn mindestens ein Ausdruck in der Liste gleich ist.
- Mit TO wird ein Wertebereich angegeben; links vom TO muss dabei der kleinere, rechts der größere Wert stehen. Die Bedingung ist dann erfüllt, wenn der Ausdruck in der SELECT-CASE-Zeile zwischen den in der CASE-Zeile angegebenen Ausdrücken liegt. Die Werte dieser Ausdrücke sind dabei einzuschließen. CASE 1 TO 3 ist also erfüllt, wenn Ausdruck den Wert 1, 2 oder 3 annimmt. Bei STRINGs wird dabei zeichenweise der ASCII-Wert der Zeichen verglichen (siehe dazu ASC).
- Wird das Schlüsselwort 'IS' eingesetzt, so kann ein eigener Vergleichsoperator angegeben werden. Die Bedingung ist dann nicht mehr erfüllt, wenn die Werte in der SELECT-CASE-Zeile und der CASE-Zeile gleich sind, sondern z. B. ungleich, größer als, usw.
Beispiele für Ausdrucksliste
SELECT CASE a
' ist a = 5?
CASE 5
' ist a ein Wert von 5 bis 10?
' Die kleinere Zahl muss zuerst angegeben werden
CASE 5 TO 10
' ist a größer als 5?
CASE IS > 5
' ist a gleich 1 oder ein Wert von 3 bis 10?
CASE 1, 3 TO 10
' ist a gleich 1, 3, 5, 7 oder b + 8?
CASE 1, 3, 5, 7, b + 8
END SELECT
Beispiel für die Benutzung von SELECT CASE:
DIM AS INTEGER wahl
INPUT "Geben Sie eine Zahl von 1 bis 10 ein: ", wahl
SELECT CASE wahl
CASE 1
PRINT "Sie haben 1 angegeben"
CASE 2
PRINT "Die Zahl ist 2"
CASE 3, 4
PRINT "Die Zahl ist 3 oder 4"
CASE 5 TO 10
PRINT "Die Zahl liegt im Bereich von 5 bis 10"
CASE IS > 10
PRINT "Die Zahl ist größer als 10"
CASE ELSE
PRINT "Die Zahl ist kleiner als 1"
END SELECT
SLEEP
Die Zeileneinrückungen sind optional; sie dienen lediglich der besseren Übersichtlichkeit. In Programmiererkreisen sind sie in jedem Falle gern gesehen.
Wenn eine Bedingung doppelt vorkommt, wird nur der erste Codeblock ausgeführt.
Beispiel:
SELECT CASE a
CASE 1
PRINT "a ist 1"
CASE 1, 2
PRINT "a ist entweder 1 oder 2"
END SELECT
Die Zeile "a ist entweder 1 oder 2" wird nur angezeigt, wenn a = 2 ist. Im anderen Fall a = 1 wird nur die Zeile "a ist 1" ausgegeben.
Beachten Sie bitte, dass die Ausdrücke in der Reihenfolge abgearbeitet werden, in der sie angegeben werden. Im obigen Beispiel wird also zuerst geprüft, ob a = 1 ist, danach ob a = 2 ist, usw. Wenn sehr häufig solche Prüfungen stattfinden, sollten Sie daher das wahrscheinlichste Ergebnis an die Spitze der Liste stellen, um nicht zu viel Zeit zu verlieren.
In frühen Formen der Sprachfamilie BASIC wurde das Konstrukt ON ... GOTO bzw. ON ... GOSUB eingesetzt, um solche Prüfstrukturen umzusetzen. Dies gilt inzwischen als veraltete und umständliche Technik.
SELECT CASE AS CONST
Bei dieser Version wird der Code effizienter umgesetzt, so dass das Programm die Entscheidungen schneller treffen kann. Allerdings gelten hier bestimmte Beschränkungen für 'Ausdruck' und 'Ausdrucksliste':
- 'Ausdruck' muss vom Typ INTEGER oder UINTEGER sein.
- 'Ausdrucksliste' darf nur Konstanten oder einfache Ausdrücke enthalten, also Ausdrücke, die keine Variablen enthalten.
- Funktionen sind in 'Ausdrucksliste' nur dann erlaubt, sofern es sich um FreeBASICs eigene mathematische Funktionen handelt (wie etwa FIX, ABS, SGN, etc.), der Rückgabetyp INTEGER oder UINTEGER ist und der Parameter eine Konstante oder ein einfacher Ausdruck wie oben beschrieben ist.
- Der Operator IS steht nicht zur Verfügung.
- In 'Ausdrucksliste' kann mit 8192 aufeinanderfolgenden (U)INTEGER-Werten verglichen werden, also z. B. im Bereich von 0 bis 8191 oder von 4 bis 8195.
CASE ELSE ist mit SELECT CASE AS CONST zulässig.
Durch diese Einschränkungen ist die Abfrage um einiges schneller als das normale SELECT CASE.
Man spricht von 'spürbaren' Unterschieden bei mehr als vier CASE-Zeilen.
Unterschiede zu QB:
- Die Variante SELECT CASE AS CONST ist neu in FreeBASIC.
- In einer Bereichsangabe 'Ausdruck TO Ausdruck' wertet QB immer beide Ausdrücke aus, auch wenn der erste Ausdruck bereits größer ist als der zu prüfende Wert.
Unterschiede zu früheren Versionen von FreeBASIC:
- Bis FreeBASIC v1.03 konnte der Zahlenbereich bei SELECT CASE AS CONST nur 4097 aufeinanderfolgende Werte umfassen.
- Seit FreeBASIC v0.16 können CASE-Anweisungsblöcke manuell über EXIT SELECT verlassen werden.
- Seit FreeBASIC v0.16 initialisiert SELECT CASE einen SCOPE-Block.
- Bitfelder können in CASE-Zeilen seit FreeBASIC v0.16 eingesetzt werden.
- Die Variante SELECT CASE AS CONST existiert seit FreeBASIC v0.12
Siehe auch:
IF ... THEN, IIF, ON ... GOTO, ON ... GOSUB, SCOPE, EXIT, CONST, CONST (Klausel), Ausdrücke, Bedingungsstrukturen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|