enum to int und int to enum
-
Ist es legal ein int in ein enum zu konvertieren bzw. andersrum? Oder erzeuge ich damit undefiniertes Verhalten?
-
ist legal
lt. standard hat der erste enum den wert 0 und jedes nachfolgende ist um eins größer.
beides kannst du natürlich umgehen, indem du von hand werte zuweist.
ist nur die frage, wofür du das brauchst!?bb
-
unskilled schrieb:
ist legal
Fast, man muss aufpassen bei der Konvertierung von einem
int
zu einemenum
. Wenn der zu konvertierende Wert ausserhalb des Wertebereichs der Enumeration liegt, dann ist das Verhalten undefiniert. Wird allerdings mit den meisten Kompiler trotzdem gehen.Grüssli
-
Wird meistens gehen, ja. Ich denke an diese Optimierung, die es manchmal kaputtmacht.
enum Farbe{ROT=1,BLAU=2,GRUEN=4,}; //sizeof(Farbe)==1, weil ich so ein geiler Compiler bin Farbe f=100; cout<<int(f);//ok Farbe f=1000; cout<<int(f);//paßt nicht
-
Ich brauche das deshalb, weil ich etwas in eine Datei schreiben will.
Zum Beispiel:
ArtNR Status
10001 2Dann kann ich die Datei einlesen und den Status dem enum zuweisen. Und beim Schreiben gehe ich den umgekehrten weg. So wars von mir gedacht.
-
Dravere schrieb:
unskilled schrieb:
ist legal
Fast, man muss aufpassen bei der Konvertierung von einem
int
zu einemenum
. Wenn der zu konvertierende Wert ausserhalb des Wertebereichs der Enumeration liegt, dann ist das Verhalten undefiniert. Wird allerdings mit den meisten Kompiler trotzdem gehen.Grüssli
hmmmm, ich verstehe nicht, was da "gehen" kann? enums werden doch über ihre Bezeichner angesprochen - und da weiß ich nicht, was da passieren soll, wenn keiner da ist....
Kurz mal in Code:
enum Farbe{ROT=1,BLAU=2,GRUEN=4}; Farbe f=ROT; switch(f) { case ROT:... // enum -> enum case BLAU:... case GRUEN:... }; switch(f) { case 1:... // enum -> int; OK case 2:... case 1000:... // wird niemals erreicht - aber OK }; f = 100; // int -> enum switch(f) { case ROT:... case BLAU:... case GRUEN:... default: ... // kein Element von Farbe };
Oder ist damit gemeint, dass (in diesem Beispiel) f später immer noch den auf einen int mit dem Wert 100 abgebildet wird?
Gruß,
Simon2.
-
enum schrieb:
Dann kann ich die Datei einlesen und den Status dem enum zuweisen. Und beim Schreiben gehe ich den umgekehrten weg. So wars von mir gedacht.
Schreib ne Konvertierungsfunktion die aus dem enum eine lesbare Zeichenkette macht. dass grün=1, rot=2 usw.ist relativ willkürlich - wenn stattdessen GRUEN, ROT usw. in der Datei steht ists viel leichter zu entziffern.
-
Simon2 schrieb:
hmmmm, ich verstehe nicht, was da "gehen" kann? enums werden doch über ihre Bezeichner angesprochen - und da weiß ich nicht, was da passieren soll, wenn keiner da ist....
...
Oder ist damit gemeint, dass (in diesem Beispiel) f später immer noch den auf einen int mit dem Wert 100 abgebildet wird?
Genau. Und das der Kompiler bei der Zuweisung 100 nicht irgendetwas anderes macht. Er könnte den Wert zum Beispiel auf ROT setzen, wäre absolut korrektes Verhalten. Oder eine Exception werfen, würde auch gehen. Es ist sogar möglich, dass das Programm einfach abstürzt und die Festplatte löscht. Ist eben undefiniertes Verhalten. Aber all das passiert meistens nicht, weil sich ein
enum
Typ einfach nur wie ein normalerint
verhält. Was wahrscheinlich auch am einfachsten für die Kompilerbauer istGrüssli
-
Dravere schrieb:
...
Genau....Ach so.
Danke,
Simon2.