Forum: Mikrocontroller und Digitale Elektronik Enumerator Constant ändern


von Redug (Gast)


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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von P. S. (namnyef)


Lesenswert?

Mir ist leider nicht so ganz klar was du vor hast.

von Harry (Gast)


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.

von S. R. (svenska)


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

von Redug (Gast)


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.

von P. S. (namnyef)


Lesenswert?

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.

von Redug (Gast)


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

von S. R. (svenska)


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

von P. S. (namnyef)


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.

von Redug (Gast)


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

von Einer K. (Gast)


Lesenswert?

Eine feine Salami!

Ich hole mir schon mal Chips und Bier dazu ....

von PittyJ (Gast)


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.

von MaWin (Gast)


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. ;-)

von S. R. (svenska)


Lesenswert?

Redug schrieb:
> Wofür ist diese "Clean" Option? Ein Kollege benutzt das oft.

Die ist wichtig.

von MaWin (Gast)


Lesenswert?

S. R. schrieb:
> Die ist wichtig.

Und was macht es?

Es löscht alle beim Compilerlauf erzeugten Dateien. Beim nächsten Build 
(einfaches make) wird alles neu gebaut.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.