PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : switch case, mit Strings



frabe
12.05.2020, 18:37
Hallo zusammen.
Möchte swich über einen String steuern.

Der Klassiker;


int Auswahl=1;
swich(Auswahl){
case 1: /*macht was*/; break;


Folgendes klappt leider nicht - komme nicht auf den Fehler.


char Auswahl[] = "Menue01";
swich(Auswahl){
case "Menue01": /*macht was*/; break;

PS: ich habe weder <stdio.h> noch <string.h> eingebunden.

Klebwax
12.05.2020, 18:49
Switch erwartet ein int, oder ein Equivalent wie enum. Und der Vergleich entspricht einem "==". Beides funktioniert nicht mit einem Array. Falsche Sprache.

MfG Klebwax

Sisor
12.05.2020, 19:42
enum ist dein Freund!

enum menu_t { start, test, hilfe };

menu_t auswahl = start;
switch(auswahl) {
case start:
start();
break;
case test:
//...
}

frabe
13.05.2020, 06:56
enum ist dein Freund!

Danke für den Tipp! Besser als mit Zahlen zu hantieren.

HaWe
13.05.2020, 15:31
case erwartet nicht nur Zahlen als Sprungmarken, sondern KONSTANTE INTEGER Zahlen: es können also nie Variablen dahinterstehen.
Wenn du Variablen einsetzen willst und dazu evtl sogar auch noch Strings, dann verwende doch einfach if... else if...

char* vergleichen geht mit
strcmp(char *str1, char *str2);
bei Gleichheit wird eine 0 zurückgeliefert (0 = kein Unterschied).

Dein Programm sähe dann so aus:


char Auswahl[10];
strcpy(Auswahl, "Menue01");

if( strcmp(Auswahl, "Menue01")==0 ) // ** tu was 1 ** ;
else
if( strcmp(Auswahl, "Menue02")==0 ) // ** tu was 2 ** ;
else
if( strcmp(Auswahl, "Hilfe")==0 ) // ** tu was 3 ** ;

frabe
13.05.2020, 15:45
Ich mag die Tabellenübersicht mit swich case - finde ich leserlicher.
Bis dato kam der mit Variablen zurecht. Aber strings (enum) machts mir noch einfacher.

HaWe
13.05.2020, 16:12
nein, case kommt NIE mit Variablen als Sprungmarken zurecht.
case kann nur Int-Konstanten verwenden, um diese dann mit Int-Variablen zu vergleichen, aber nicht selber Floats oder Strings oder Vergleichsoperatoren (<,=,>) oder Funktionswerte verwenden - und auch nicht, wenn sie selber Variablen sind.

enum sind auch keine Strings, sondern quasi Namen (Bezeichner) für Integerkonstanten

Sisor
13.05.2020, 16:19
Es ging frabe wohl eher um Bezeichner in Switch-Case-Konstrukten als tatsächlich um Strings.

HaWe
13.05.2020, 16:25
das war nicht so ganz klar, im TO Post wird ja auf char[] getestet.

Wenn also z.B. die Variablen, auf die geprüft wird, z.B.von Serial-Inputs (Tastatureingaben in der Serial-Konsole oder verschickte UART-Strings von anderen MCUs) oder aus SD-Text-Files oder von Websites stammen (GET/POST), dann wären es ja "echte Strings", auf die getestet werden müsste, und dann bräuchte man auch Strings als Sprungmarken - was aber ja nicht geht.

frabe
14.05.2020, 12:47
enum{FadeIN, FadeOUT, Dimm};
//...
if(ProzStart == ProzEnd) Auswahl = Dimm;
if(ProzStart < ProzEnd) Auswahl = FadeIN;
if(ProzStart > ProzEnd) Auswahl = FadeOUT;
//...
switch(Auswahl) {
case FadeIN:
//..

klappt super einfach!

Ich verstehe euch bzgl. if else vs. swich case; swich case ist in seinem Vergleichsmöglichkeiten und Variablenverarbeitung wesentlich eingeschränkter.
Finde aber die "tabellen/blockartige" Ausprägung übersichtlicher - Geschmackssache...