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


  • Administrator

    unskilled schrieb:

    ist legal

    Fast, man muss aufpassen bei der Konvertierung von einem int zu einem enum . 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 2

    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.



  • Dravere schrieb:

    unskilled schrieb:

    ist legal

    Fast, man muss aufpassen bei der Konvertierung von einem int zu einem enum . 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.


  • Administrator

    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 normaler int verhält. Was wahrscheinlich auch am einfachsten für die Kompilerbauer ist 🙂

    Grüssli



  • Dravere schrieb:

    ...
    Genau....

    Ach so.

    Danke,

    Simon2.


Log in to reply