Enumerator Constant ändern

Gast #6208912
Hallo,
ich habe folgenden Typ definiert:
typedef enum
{
  UNINIT              = (uint8)0,
  NORMAL              = (uint8)1,
  COLD                = (uint8)2,
  DERATING            = (uint8)3,
  SHUTDOWN            = (uint8)4

} StateType;

das wird dann später bei einem SwitchCase angewendet.
Nun bin ich am simulieren und würde gerne, Visualisierungshalber, die 
Reihenfolge ändern. Anscheinend geht es nicht so einfach, indem man die 
Stellen der Konstanten in der Deklaration ändert, da zB beim SwitchCase 
immer noch die älteren Werten an die Constanten hängen. Die Alternative 
wäre einen neuen Typ definieren und jede Stelle im Programm dann 
entsprechend ändern.
Geht es noch schneller

Danke
Gast
Ohne deine Frage bzw. den Sinn hinter der Aktion zu verstehen:
Du kannst per Präprozessor ("#define", "#ifdef" etc.) eine Debug- und 
eine Release-Version compilieren lassen.
Gast
Redug schrieb:

> Nun bin ich am simulieren und würde gerne, Visualisierungshalber, die
> Reihenfolge ändern. Anscheinend geht es nicht so einfach, indem man die
> Stellen der Konstanten in der Deklaration ändert, da zB beim SwitchCase
> immer noch die älteren Werten an die Constanten hängen. Die Alternative

Ich verstehe dein Vorhaben auch nicht, was willst du änderen? Wenn du 
Antworten haben möchtest, dann zeige uns ein Beispiel: Vorher - Nachher.

Welcher "Anscheinend" hat dir gesagt, daß das nicht so einfach geht? Der 
Compiler nimmt immer deine aktuelle Deklaration, da bleiben beim 
SwitchCase keine älteren Werten hängen.
Da du allen Enumerationen feste Werte zugewiesen hast, kannst du die 
beliebig in der enum umhertauschen, da ändert sich nix.

Wenn du die Labels mit neuen Zahlen versehen willst, dann kannst du das 
auch machen, solange der Code nicht von den bestimmten Werten abhängt 
(und z.B. zwei Werte vergleicht, oder mit einer Zahl vergleicht, etc.). 
Du solltest in dem Fall allerdings einmal komplett neu kompilieren.

Blöde Frage: Funktioniert das mit dem (uint8_t)cast für jeden Wert? In 
meinem Weltbild waren enums immer "int oder breiter" und deine Casts 
sind nutzlos.

In C++11 könnte man mit "typedef enum : uint8 { ... }" den Typ explizit 
festlegen, aber in C muss man m.W. grundsätzlich am Übergabepunkt casten 
(oder implizit casten lassen).
Gast
Erstmal danke für die Hilfsbereitschaft,
also, der Typ ist so definiert:
typedef enum
{
  UNINIT              = (uint8)0,
  NORMAL              = (uint8)1,
  COLD                = (uint8)2,
  DERATING            = (uint8)3,
  SHUTDOWN            = (uint8)4

} StateType;

dann gibt es ein SwitchCase:
 switch( var )
    {
      case COLD:
      {
        ...
        break;
      }
      case NORMAL:
      {
        ...
        break;
      }

dann ändere ich nur die Definition so (COLD und NORMAL umgetauscht, 
Zahlen behalten aber die Reihenfolge):
typedef enum
{
  UNINIT              = (uint8)0,
  COLD              = (uint8)1,
  NORMAL            = (uint8)2,
  DERATING            = (uint8)3,
  SHUTDOWN            = (uint8)4

} StateType;

Beim laufenden Programm stelle ich dann fest, dass die Variable in den 
falschen Case landet. Ich hätte erwartet, dass das irgendwie sich 
automatisch anpasst.
Redug schrieb:
> Beim laufenden Programm stelle ich dann fest, dass die Variable in den
> falschen Case landet.

Was ist denn aus deiner Sicht der "falsche case"? Ich denke, da liegt 
der Hund begraben.

Wenn "var=COLD" ist, wird man immer im "case COLD" landen, egal in 
welcher Reihenfolge die enum deklariert ist.
Gast
P. S. schrieb:
> Wenn "var=COLD" ist, wird man immer im "case COLD" landen, egal in
> welcher Reihenfolge die enum deklariert ist.

da bin ich bei dir. tut es aber nicht. Ich vermute es ist ein 
Preproc/Kompilerfehler.



S. R. schrieb:
> unktioniert das mit dem (uint8_t)cast für jeden Wert?

Bezüglich des Castings, weiss ich nicht, da ich den Code übernommen habe
Redug schrieb:
> Beim laufenden Programm stelle ich dann fest, dass die Variable
> in den falschen Case landet. Ich hätte erwartet, dass das
> irgendwie sich automatisch anpasst.

Wahrscheinlich ist dein Buildsystem kaputt, d.h. das Typedef liegt in 
einem Header und wenn du den änderst, werden nicht alle davon abhängigen 
Dateien neu gebaut. Versuche mal "make clean; make".

Die andere Variante ist, dass du nicht überall COLD und NORMAL benutzt, 
sondern irgendwo auch die Zahlen. Das darfst du natürlich nicht.

(Dies war ein Ratschlag ihres örtlichen Glaskugelträgers.)
Redug schrieb:
> da bin ich bei dir. tut es aber nicht. Ich vermute es ist ein
> Preproc/Kompilerfehler.

Das vermute ich nicht :D

Wie belegst du denn die Variable var? Mit "var = NORMAL;" oder "var = 
(uint8)2;" Wobei zweiteres natürlich Murks ist, aber vielleicht das 
Verhalten erklären könnte.

Ohne vollständigen Code (bzw. vollständiges Minimalbeispiel) ist es halt 
schwer das Problem zu finden.
Gast
es ist eine Eclipse-basierte Umgebung. Ich habe es gerade mit der Option 
"Clean" Build probiert. Passiert aber nichts.
Wofür ist diese "Clean" Option? Ein Kollege benutzt das oft.

P. S. schrieb:
> Wie belegst du denn die Variable var?

switch( GetState() )
  {
    case COLD:
    {

      break;
    }
    case NORMAL:
    {

      break;
    }

die Variable wird durch Get/Set Funktionen belegt bzw. gelesen
Gast
Die Zahlen im Enum sind doch Sch... egal.
Lass die doch einfach weg, dann macht der Compiler das für dich, und du 
brauchst nicht denken.

also nur
typedef enum
{
  UNINIT ,NORMAL,COLD, DERATING ,SHUTDOWN
} StateType;

Das mit den Zahlen solltest du den Profis überlassen.
Gast
PittyJ schrieb:
> Das mit den Zahlen solltest du den Profis überlassen.

Das zeigt, dass du kein Profi bist!

In C sind Enums nichts anderes als Int Konstanten. Du kannst genauso gut 
#define oder const verwenden. Sie dienen (leider) nur der besseren 
Lesbarkeit.

Enums machen erst bei C++ wirklich Sinn. Dort sind es eigene Datentypen 
und der Compiler haut den Möchtegernprogrammieren auf ihre schmudelligen 
C-Finger. ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.