Enumerator Constant ändern

Gast #6208912
Lesenswert?

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 #6209133
Lesenswert?

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.
#6209290
Lesenswert?

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 #6209312
Lesenswert?

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.
Gast #6209324
Lesenswert?

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
#6209325
Lesenswert?

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.)
#6209330
Lesenswert?

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 #6209418
Lesenswert?

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 #6209598
Lesenswert?

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 #6209805
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren