Arduino Forum

International => Deutsch => Topic started by: Chris72622 on Oct 25, 2013, 02:43 pm

Title: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Chris72622 on Oct 25, 2013, 02:43 pm
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
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: sschultewolter on Oct 25, 2013, 03:37 pm
In der Switch-Case Anweisung gibt es nach meinem Kenntnisstand keine Möglichkeit, Strings zu verwenden. Dir bleiben char und int zur Verfügung.

Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Serenifly on Oct 25, 2013, 03:41 pm
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?
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: sschultewolter on Oct 25, 2013, 03:43 pm
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
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Chris72622 on Oct 25, 2013, 03:50 pm

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


Richtig.  :*

Gruß Chris
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: sschultewolter on Oct 25, 2013, 03:57 pm
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.
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Serenifly on Oct 25, 2013, 03:57 pm
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)
{ ... }
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Chris72622 on Oct 25, 2013, 04:07 pm
GEIL!  8)

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

Gruß Chris
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: udoklein on Oct 25, 2013, 04:41 pm
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();
}
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: guntherb on Oct 25, 2013, 05:34 pm
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:
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Chris72622 on Oct 26, 2013, 10:40 am
Erschließt sich einem schnell, finde ich. Danke!

Gruß Chris
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: Serenifly on Oct 26, 2013, 03:58 pm
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
Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: michael_x on Oct 26, 2013, 08:19 pm
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;
}

Title: Re: switch case Beispiel mit Zeichenbenennung gesucht
Post by: uwefed on Oct 26, 2013, 08:35 pm
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