switch case Beispiel mit Zeichenbenennung gesucht

Hallo,

ich suche ein Beispiel in dem switch case unter Verwendung von "Wörtern" (ähnlich wie Enum) verwendet wird.

Pseudocode:

switch(Fortbewegungsmittel)
{
  case Auto:
  {
    bla-bla;
  }
  break;
  
  case Flugzeug:
  {
    blubb-blubb;
  }
  break;
}

Wie schreibt man das richtig?

Gruß Chris

In der Switch-Case Anweisung gibt es nach meinem Kenntnisstand keine Möglichkeit, Strings zu verwenden. Dir bleiben char und int zur Verfügung.

Auf strings kann man in C/C++ nicht switchen. Das geht u.a. in C# (was mich seht gefreut hat als ich es entdeckt habe) und in Java seit Version 7.

Du kannst if/else Blöcke und strcmp() verwenden. Ist aber generell keine so gute Idee, da strings relativ viel RAM brauchen. Wieso gehen enums hier nicht?

Ich denke, es geht dem TE hauptsächlich um eine nachvollziehbarere Möglichkeit, den Code zu lesen. Mache lieber ein paar Kommentare mehr, die fressen dir den RAM nicht auf :stuck_out_tongue_winking_eye:

sschultewolter:
Ich denke, es geht dem TE hauptsächlich um eine nachvollziehbarere Möglichkeit, den Code zu lesen.

Richtig. :*

Gruß Chris

Dann mach lieber Kommentare. Nicht dass dein Sketch nachher hinfällig ist, weil du deinen kompletten RAM aufgebraucht hast.
Ob nun 10 Kommentaren Zeilen oder 500 spielen für den Kompiler keiner Rolle.

Also, enum switchen ist kein Problem:

enum fortbewegungsmittel { AUTO, FLUGZEUG };

void update(byte command)
{
  switch(command)
  {
     case AUTO:
     {
         bla-bla;
     }
     break;
  
     case FLUGZEUG:
     {
        blubb-blubb;
     }
     break;
   }
}

void loop()
{
     update(AUTO);
}

Mann kann auch eine Variable des Enums anlegen and dann Dinge zuweisen:

typedef enum { AUTO, FLUGZEUG } fortbewegungsmittel;
fortbewegungsmittel aktuellesFbwm = AUTO;

....

aktuellesFbwm = FLUGZEUG

if(aktuellesFbwm == FLUGZEUG)
{ ... }

GEIL! 8)

Wird meinen Code megamäßig vereinfachen- huhuuuuu!!!

Gruß Chris

Warum nicht so:

void *engine_command();
...
void decelerate() { 
... 
}
void accelerate() { 
...
}

void loop() {
...
    engine_command = accelerate;
...

    // und jetzt der Switch Ersatz --> Command einfach ausführen
    engine_command();
}

Auch auf die Gefahr hin, mich als Unwissender zu outen, ich habs so gemacht:

#define Auto  1;
#define Flugzeug  2;

switch(Fortbewegungsmittel)
{
  case Auto:
    bla-bla;
   break;
  
  case Flugzeug:
     blubb-blubb;
     break;
}

ist vielleicht nicht so elegant wie die anderen Beispiele, aber ich versteh' es wenigsten. :blush:

Erschließt sich einem schnell, finde ich. Danke!

Gruß Chris

Defines/Makros sind weit verbreitet, aber haben das Problem, dass es eben nur Text-Ersetzungen vor dem Compilieren sind. Es findet also keinerlei Überprüfung statt. Das kann zu merkwürdigen Fehlern führen. Außerdem halten defines keinen Gültigkeitsbereich/Scope ein, egal wo sie stehen. Heute wird deshalb oft davon abgeraten.

"const" Konstanten werden dagegen wie normale Variablen behandelt, und Compiler (gerade im Embedded Bereich) sind so intelligent, dass sie in den meisten Fällen die Konstanten direkt ins ROM schreiben wenn es möglich ist. Es wird also i.d.R. kein RAM Speicher gebraucht. Das ist aber nicht 100% garantiert.

Bei enums ist man sicherer, dass kein RAM für die Deklaration gebraucht wird.

Das ist auch historisch gewachsen. Const in C++ ist was anderes als in C. Die ganze Makro Geschichte hat sich in C eingebürgert und ist dann als "Tradition" erhalten geblieben.

Wird hier gut erklärt:

#define Auto 1;
#define Flugzeug 2;

switch(Fortbewegungsmittel)
{
case Auto:
bla-bla;
break;

#define haben ausserdem den Nachteil, dass man gern mal ein ; schreibt, wo keins sein darf :wink:

Dein Beispiel ist übrigens ein perfekter Anwendungsfall für enums

enum  { Auto; Flugzeug; Sonstwas;} Fortbewegungmittel;
Fortbewegungsmittel = wieAuchImmer();
switch(Fortbewegungsmittel)
{
  case Auto:
    blabla();
   break;
}

Noch ein Fallstrick bei #define
Der Preprozzessor tauscht alle Strings aus unabhängig ob es Texte, Variablen oder Funktionen sind.
Dadurch kann es passieren daß ein Sketch nicht mehr funktioniert bzw ein falscher Text ausgegeben wird.
Grüße Uwe