Alles in Enum durchgehen



  • Hallo,

    ich stehe vor einen ungewöhnlichen Problem. Ich habe festgestellt, dass in einer Klasse, die ich verwebnde ein enum definiert ist, der aber je nach Betriebssystem unterschiedlich ist.

    // Linux
    enum Bereich {
      vorne = 1,
      hinten,
      links,
      rechts,
      oben,
      unten
    };
    // Windows
    enum Bereich {
      vorne = 5,
      hinten = 10,
      links = 15,
      rechts = 20
    }
    // Mac
    enum Bereich {
      vorne = 7,
      hinten,
      links,
      rechts,
      oben,
      unten
    }
    

    Wieso das so ist? Ich weiß es nicht, aber die Klasse arbeitet super und tut die Dienste. Jetzt müsste ich für jeden Bereich eine Farbe definieren.

    class A {
      void ColorSet(unsigned int& bereich, const Farbe& f);
    }
    
    main ()
    {
      for (? enum Bereich ?)
      {
        a->ColorSet(-bereich-,RED);
      }
    }
    

    Unter Windows kann man "oben" und "unten" nicht definieren, da gibt es Standardwerte.

    Ich hab jetzt schon einiges versucht, aber ich finde keinen Weg um festzustellen, ob eine Zahl in einem enum enthalten ist (sprich ist 11 gültig für Bereich falls cast) oder den höchsten und niedrigsten Wert (unter Linux 1 und 6, unter Windows 5 und 20). Ich vermute mal, es geht nicht, aber ich wollte doch mal kurz nachfragen.



  • Du weisst es aber zur Kompilierzeit. Sprich kannst du die gleichen Schalter benutzen, wie die für Linux, Windows und Mac und so einfach entscheiden, welche und wieviele es sind.



  • Naja, so mach ich es auch derzeit. Ist halt ne Menge schreibarbeit. Aber wenn es sein muss.

    Was passiert eigentlich bei folgendem Code.

    enum Bereich {
      vorne = 1,
      hinten = 3
    }
    main ()
    {
      for (size_t i = 1; i<=3 ; i++)
      {
        Bereich b = static_cast<Bereich>(i);
      }
    }
    

    Gibt es eine Möglichkeit abzufragen ob der cast klapt? Er dürfte ja nur bei 1 und 3 Erfolg haben zu casten. Und ansonsten müsste doch eigentlich irgend ne exeption geworfen werden. Wenn ich das allerdings teste, dann passiert irgendwie kein Fehler. Kann mir das jemand erklären?



  • enum Bereich
    {
    	vorne = 1,
    	hinten = 3
    };
    
    #include <iostream>
    
    std::ostream& operator<< (std::ostream &s, Bereich out)
    {
    	return s << "enum " << (int)out;
    }
    
    int main()
    {
    	for (size_t i = 1; i != 5; ++i)
    	{
    		Bereich b = static_cast<Bereich>(i);
    		std::cout << b << std::endl;
    	}
    }
    

    funktioniert bei mir anstandslos - leider ><
    wird aber vermutlich unter implementation defined fallen...

    bb


  • Mod

    stefanjann schrieb:

    Gibt es eine Möglichkeit abzufragen ob der cast klapt?

    Der Cast hat ein definiertes Verhalten, wenn das Argument (in diesem Fall) zwischen einschließlich 0 und 3 liegt, andernfalls ist es undefiniert. Es muss nicht zu jedem Wert, den eine Aufzählungsvariable annehmen kann, eine entsprechende Aufzählungskonstante existieren.
    Die Allgemeinen Grenzen sind etwas umständlich zu beschreiben (Standard 7.2). Die zulässigen Werte sind diejenigen, die das kleinste Bitfeld, das alle Aufzählungskonstanten darstellen kann, annehmen kann.

    enum { x = 90 };
    

    Die größte Konstante ist hier 90 (der kleinste 0, da kein negativer Wert aufgeführt wurde), dafür benötigen wir 7 bit, folglich ist der größte Wert, den wir verwenden dürften 2^7-1=127.



  • stefanjann schrieb:

    Gibt es eine Möglichkeit abzufragen ob der cast klapt? Er dürfte ja nur bei 1 und 3 Erfolg haben zu casten. Und ansonsten müsste doch eigentlich irgend ne exeption geworfen werden. Wenn ich das allerdings teste, dann passiert irgendwie kein Fehler. Kann mir das jemand erklären?

    Es wird garantiert keine Exception geworfen. Im Gegensatz zu dynamischeren Sprachen wie Java sind Enum-Konstanten zur Laufzeit nicht existent, es gibt auch keine Laufzeitprüfung oder sowas. Das bedeutet, man kommt weder an deren Namen, noch an alle Enumeratoren eines enums . Das einzige, was man hat, ist eine Zahl von einem Integertypen, der sicher gross genug ist, um alle Enumeratoren zu repräsentieren.


Anmelden zum Antworten