Pages: [1]   Go Down
Author Topic: switch case Beispiel mit Zeichenbenennung gesucht  (Read 675 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

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

Pseudocode:

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

Wie schreibt man das richtig?

Gruß Chris
Logged


Offline Offline
Faraday Member
**
Karma: 43
Posts: 2559
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Keinen technischen Support über PN!
Hat dir meine Antwort gefallen, nicht sparsam mit dem Karma sein smiley-wink

Offline Offline
Faraday Member
**
Karma: 120
Posts: 3972
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Faraday Member
**
Karma: 43
Posts: 2559
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Keinen technischen Support über PN!
Hat dir meine Antwort gefallen, nicht sparsam mit dem Karma sein smiley-wink

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Richtig.  smiley-kiss

Gruß Chris
Logged


Offline Offline
Faraday Member
**
Karma: 43
Posts: 2559
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Keinen technischen Support über PN!
Hat dir meine Antwort gefallen, nicht sparsam mit dem Karma sein smiley-wink

Offline Offline
Faraday Member
**
Karma: 120
Posts: 3972
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also, enum switchen ist kein Problem:

Code:
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:
typedef enum { AUTO, FLUGZEUG } fortbewegungsmittel;
fortbewegungsmittel aktuellesFbwm = AUTO;

....

aktuellesFbwm = FLUGZEUG

if(aktuellesFbwm == FLUGZEUG)
{ ... }
« Last Edit: October 25, 2013, 09:02:18 am by Serenifly » Logged

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

GEIL!  smiley-cool

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

Gruß Chris
Logged


0
Online Online
Faraday Member
**
Karma: 23
Posts: 3482
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Warum nicht so:

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

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

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

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Edison Member
*
Karma: 38
Posts: 1164
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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
« Last Edit: October 25, 2013, 10:36:14 am by guntherb » Logged

Grüße
Gunther

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gruß Chris
Logged


Offline Offline
Faraday Member
**
Karma: 120
Posts: 3972
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 58
Posts: 3046
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 265
Posts: 21626
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
 
Logged

Pages: [1]   Go Up
Jump to: