Hallo zusammen
Mal eine ganz blöde Frage für C-Programmierung.
Ich habe 2 enum definiert:
1
enumUnitReply
2
{
3
ParameterInvalid=0x02,
4
ParameterOutOfRange=0x03,
5
ParameterUnknown=0x04,
6
CommandOk=0x40,
7
CommandInvalid=0x41,
8
CommandFinished=0x42,
9
StatePowerUp=0x80,
10
StateReady=0x81,
11
StateBusy=0x82,
12
StateEmergencyStop=0x83
13
};
14
15
enumModuleReply
16
{
17
ParameterInvalid=0x02,
18
ParameterOutOfRange=0x03,
19
ParameterUnknown=0x04,
20
CommandOk=0x10,
21
CommandInvalid=0x11,
22
CommandFinished=0x12,
23
State=0x60,
24
FlashWriteCounter=0x70
25
};
Je ich möchte jetzt im einen Fall den Wert für "CommandFinished" von
ModuleReply und einamal den Wert für UnitReply nehmen.
Wenn ich den enum aber so im header definiere, sagt mir der Compiler
dass CommandFinished schon einmal definiert wurde, ich möchte aber den
Wert aus dem entsprechenden enum nehmen, und die enum im gleichen header
File definieren da ich im c file beide enum benötige.
Kann mir da bitte jemand auf die Sprünge helfen?
Danke
In C sind leider die in den enums definierten Werte global und müssen
daher eindeutig sein. Außerdem macht der Compiler auch keine ordentliche
Überprüfung, ob die Werte überhaupt zu dem jeweligen enum gehören. Die
Werte sind einfache Interger-Konstanten. Das sind ganz gewaltige
Schwächen von C.
In C++ kann man mit Namespaces arbeiten und somit ggf. sogar jedem enum
einen eigenen verpassen. Dann könnte man z.B. explizit auf
UnitReply::CommandFinished zugreifen.
Auf einen ganz einfachen Nenner gebracht:
In C sind enums die Energie nicht wert, die das Tippen des
Schlüsselwortes benötigt. Die C 'Implementierung' von enum ist mehr oder
weniger nutzlos. enums sind in C nicht viel mehr als eine Sammlung von
Text-Flags, die Werte repräsentieren. Mehr nicht. Gegenüber einer
Sammlung von #defines gewinnst du eigentlich nur, dass du in
Funktionsköpfen
1
enumUnitReplyfoo(enumColorValuebackground);
einen gewissen dokumentarischen Hinweis gibst, welche Werte erwartet
werden bzw. womit man als Programmierer rechnen muss. Aber: das wird von
nichts und niemandem eingefordert. In C sind enums keine eigenständigen
Typen und werden hemmungslos von und nach int konvertiert, wie es gerade
passt. Du kannst auch zb an den Paramater background, der ja eigentlich
ein enum ColorValue ist, einen Wert aus dem enum UnitReply übergeben. Da
stört sich nichts und niemand daran.
enum sind in C ernsthaft fehlerhaft. Ausser einer glorifizierten Liste
von Integern, denen man einen Namen geben kann und die man unter einem
Stichwort zusammenfasst, und die im Debugger auftauchen, bleibt nicht
viel übrig.
Karl Heinz schrieb:> Du kannst auch zb an den Paramater background, der ja eigentlich> ein enum ColorValue ist, einen Wert aus dem enum UnitReply übergeben. Da> stört sich nichts und niemand daran.
Naja, sicher kannst, aber der Compiler sollte ein Warning generieren.
"enumerated type mixed with another type"
Also ganz nutzlos sind enums nicht.
Hallo
Ok, und das heisst wie löst man dies jetzt richtig?
Ich habe keine Lust im Code Hex-Werte zu ändern und über defines geht es
ja, aber ist da nicht eine bessere Lösung vorhanden?
Mit einem struct oder geht das wirklich nur über defines?
Danke
foo schrieb:> Was willst Du machen?
enum UnitReply
{
CommandFinished = 0x42,
} ;
enum ModuleReply
{
CommandFinished = 0x12,
};
CommandFinished mit 2 Werten je nachdem welchen enum ich wähle
verwenden.
Aber demzufolge geht das nur mit zum Bsp:
Dann kann ich auch direkt #define verwenden und den enum kicken...
enum UnitReply
{
UnitCommandFinished = 0x42,
} ;
enum ModuleReply
{
ModuleCommandFinished = 0x12,
};
Korrekt? Ist C wirklich nicht zu mehr fähig? Oder bin ich zu blöd?
Mach Fax schrieb:> CommandFinished mit 2 Werten je nachdem welchen enum ich wähle> verwenden.
Und die Antwort ist immer noch dieselbe: Das geht in C nicht.
Nicht umsonst wird C++ manchmal auch als 'das bessere C' bezeichnet. Da
wurden zb. derartige Dinge 'gefixt'.
Mach Fax schrieb:> Dann kann ich auch direkt #define verwenden und den enum kicken...
Yep, das kannst du. Der wesentliche Unterschied ist, dass die
enum-Werte vom Debugger angezeigt werden können.
Jörg Wunsch schrieb:> Yep, das kannst du. Der wesentliche Unterschied ist, dass die> enum-Werte vom Debugger angezeigt werden können.
Ok Danke @ all für die Antworten!!!