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
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.
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).
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.
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.
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
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.
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. ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.