Go Down

Topic: switch case Beispiel mit Zeichenbenennung gesucht (Read 828 times) previous topic - next topic

Chris72622

Hallo,

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

Pseudocode:

Code: [Select]
switch(Fortbewegungsmittel)
{
 case Auto:
 {
   bla-bla;
 }
 break;
 
 case Flugzeug:
 {
   blubb-blubb;
 }
 break;
}


Wie schreibt man das richtig?

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

sschultewolter

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

Keinen technischen Support über PN!

Serenifly

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?

sschultewolter

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 ;P
Keinen technischen Support über PN!

Chris72622


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


Richtig.  :*

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

sschultewolter

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.
Keinen technischen Support über PN!

Serenifly

#6
Oct 25, 2013, 03:57 pm Last Edit: Oct 25, 2013, 04:02 pm by Serenifly Reason: 1
Also, enum switchen ist kein Problem:

Code: [Select]

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:
Code: [Select]

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

....

aktuellesFbwm = FLUGZEUG

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

Chris72622

GEIL!  8)

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

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Udo Klein

Warum nicht so:

Code: [Select]

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

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

    // und jetzt der Switch Ersatz --> Command einfach ausführen
   engine_command();
}
Check out my experiments http://blog.blinkenlight.net

guntherb

#9
Oct 25, 2013, 05:34 pm Last Edit: Oct 25, 2013, 05:36 pm by guntherb Reason: 1
Auch auf die Gefahr hin, mich als Unwissender zu outen, ich habs so gemacht:

Code: [Select]

#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.  :smiley-red:
Grüße
Gunther

Chris72622

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

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Serenifly

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:
http://www.embedded.com/electronics-blogs/programming-pointers/4023858/Symbolic-Constants
http://www.embedded.com/electronics-blogs/programming-pointers/4023879/Enumeration-Constants-vs-Constant-Objects

michael_x

Quote
#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 ;)

Dein Beispiel ist übrigens ein perfekter Anwendungsfall für enums
Code: [Select]
enum  { Auto; Flugzeug; Sonstwas;} Fortbewegungmittel;
Fortbewegungsmittel = wieAuchImmer();
switch(Fortbewegungsmittel)
{
  case Auto:
    blabla();
   break;
}


uwefed

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

Go Up