enum



  • Hallo!!

    ich habe folgenden Code geschrieben:

    class Window {
    public:
    	enum eSTYLE {
    	SYSMENU, MINBOX, MAXBOX, CLOSEBOX
    	};
    private:
    	int xpos;
    	int ypos;
    	int xsize;
    	int ysize;
    	string title;
    	eSTYLE stil;
    public:
    	Window(int x, int y, int l, int b, string t, eSTYLE s);
    	~Window();
    	void Paint();
    	void MoveWin(int x, int y);
    	void ResizeWin(int x, int y);
    };
    
    ....
    
    void main() {
    	Window win1(10, 20, 50, 60, "Fenster1", Window::eSTYLE(Window::SYSMENU));
    	Window win2(100, 200, 500, 600, "Fenster2", Window::eSTYLE(Window::MINBOX|Window::SYSMENU));
    

    Wieso bitte gibt ergibt sich aus win2 beim Verwenden von "cout << style" (ich gebe jetzt nicht die Methode an, in der das vorkommt) ein Wert von "3"? Denn dieser Wert steht doch eigentlich für die vierte enum-Komponente, also für CLOSEBOX... ??

    Vielen Dank im voraus 🙂



  • warum mit der zahl arbeiten ? das is doch der sinn des enums das du keine zahl brauchst

    if( Window::MAXBOX )
    std::cout << "MaxBox"



  • Mit enum-Werten wird nicht gerechnet, darum werden sie in int-Zahlen umgewandelt - und "2 | 1 " ergibt nunmal den Wert 3 (rein zufällig MAXBOX). Wenn du deine Flags getrennt auswerten können willst, mußt du die Werte explizit auf Zweierpotenzen verteilen, dann kommen sie sich bei solchen Operationen nicht in die Quere.

    PS: Bist du sicher, daß du nicht einen enum-Wert unterschlagen hast? Die 3 sollte eher bei der Kombination MINBOX|MAXBOX auftreten.



  • Zu Mr Evil:
    danke, aber ich sitze da grad an einem Übungsprogramm und ich möchte es nur verstehen. Dieses Programm hat keinen wirklich praktischen Nutzen, deshalb arbeite ich auch mit der Zahl.

    Zu CStoll:
    ich bin sicher, dass ich keinen enum-Wert unterschlagen habe!
    und was für eine Rechenoperation soll dieser senkrechte Strich '|' sein? Ich weiß nämlich nicht, wie ich bei "2|1" auf "3" kommen soll, ausser dieser Strich wird durch ein "+" ersetzt?? 😮

    Ciao und hoffentlich bis gleich... ? 😉



  • julchen81 schrieb:

    ich bin sicher, dass ich keinen enum-Wert unterschlagen habe!

    Dann passt der Code-Schnipsel nicht zu deiner Fehlerbeschreibung (außer das MAXBOX wird irgendwo im Inneren der Klasse mit reingerechnet).

    und was für eine Rechenoperation soll dieser senkrechte Strich '|' sein? Ich weiß nämlich nicht, wie ich bei "2|1" auf "3" kommen soll, ausser dieser Strich wird durch ein "+" ersetzt?? 😮

    Das ist eine bitweise ODER-Kombination. Die Zahlen werden im Binärformat ausgeschrieben und jede Stelle wird einzeln miteinander verknüpft:

    2 = 0010
    1 = 0001
    --------
        0011 = 3
    


  • Hi!
    Wenn mich nicht alles täuscht, ist das ein Bitvergleich (in diesem Fall ein logisches 'or'). Also:

    true | false = true
    false | true = true
    true | true = true
    false | false = false

    oder:

    1 | 0 = 1
    0 | 1 = 1
    1 | 1 = 1
    0 | 0 = 1

    In deiner Anwendung:

    0001 --> '1'
    0010 --> '2'
    ----
    0011 --> die im Programm auftretende '3'



  • @CStoll
    ah... binäre Addition, *Groschen-Fall* - danke für deine Lösung!

    Also dieses MAXBOX wird nirgendwo mit eingerechnet, hier ist der (nahezu) komplette Code:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Window {
    public:
    	enum eSTYLE {
    	SYSMENU, MINBOX, MAXBOX, CLOSEBOX
    	};
    private:
    	int xpos;
    	int ypos;
    	int xsize;
    	int ysize;
    	string title;
    	eSTYLE stil;
    public:
    	Window(int x, int y, int l, int b, string t, eSTYLE s);
    	~Window();
    	void Paint();
    	void MoveWin(int x, int y);
    	void ResizeWin(int x, int y);
    };
    
    Window::Window(int x, int y, int l, int b, string t, eSTYLE s) {
    	xpos = x;
    	ypos = y;
    	xsize = l;
    	ysize = b;
    	title = t;
    	stil = s;
    	cout << title << " erstellt.\n";
    }
    
    Window::~Window() {
    	cout << title << " Fenster vernichtet!\n";
    }
    
    void Window::Paint() {
    	cout << title << endl;
    	cout << "Position: " << xpos << ", " << ypos << endl;
    	cout << "Groesse: " << xsize << ", " << ysize << endl;
    	cout << "Stil: " << stil << endl << endl;
    }
    
    void Window::MoveWin(int x, int y) {
    ....
    }
    
    void Window::ResizeWin(int x, int y) {
    ....
    }
    
    void main() {
    	Window win1(10, 20, 50, 60, "Fenster1", Window::eSTYLE(Window::SYSMENU));
    	Window win2(100, 200, 500, 600, "Fenster2", Window::eSTYLE(Window::MINBOX|Window::SYSMENU));
    
    	win1.Paint();
    	win2.Paint();
    }
    


  • @CStoll

    oh mein Gott, ich blindes Huhn... du hattest Recht, es wird mir keine 3 sondern eine 1 ausgegeben.

    Hab nämlich meine und die Musterlösung nebenher angesehen, und in DER wird eine 3 ausgegeben (die ist natürlich ein bisschen anders als meine Lösung, daher passt das da auch!

    @SlimJim
    danke dir auch... macht mich etwas skeptisch, deine Idee, denn was passiert bei 3|1 ? Da stimmt das dann nämlich nicht mehr so ganz... die binäre Addition ergibt dann nämlich einen Übertrag - oder versteh ich da jetzt was falsch?

    grüßle



  • julchen81 schrieb:

    ...die binäre Addition ergibt dann nämlich einen Übertrag - oder versteh ich da jetzt was falsch?

    Vergiß den Begriff binäre Addition.

    3|1 ist weiterhin ein binäres oder, und ergibt daher weiterhin 3 - Keine binäre Addition.

    3: 11
    1: 01
    binäres oder: 11 | 01 = 11

    cu Andé



  • Und jetzt doch noch mal:

    wenn ich CLOSEBOX|MINBOX übergebe, ergibt sich der Wert "3", was aber dann nicht durch binäre Addition zu erklären ist:
    1 1
    + 0 1
    ------
    1 0 0 , also 4.

    Allerdings mit der oder-Verknüpfung von Slim Jim ergibt sich 1 1, also 3, was auch mein Programm ausgibt.

    Wie's scheint hatte doch Slim Jim die richtige Idee oder ich übersehe wieder was?? 🙄

    ciao...



  • julchen81 schrieb:

    Und jetzt doch noch mal:...

    Wie's scheint hatte doch Slim Jim die richtige Idee oder ich übersehe wieder was?? 🙄...

    Wie schon angemerkt sind die Operatoren | und & ein Bitweiser Vergleich (im Gegensatz zu || und && die einen ganzheitlichen Vergleich machen).

    Am Beispiel:
    0011
    | 0101
    ------
    0111
    (Überall wo mindestens ein Bit gesetzt ist, ist es anschließend auch gesetzt)

    0011
    & 0101
    ------
    0001
    (Überall wo beide Bits gesetzt sind, ist es anschließend auch gesetzt)



  • julchen81 schrieb:

    Wie's scheint hatte doch Slim Jim die richtige Idee oder ich übersehe wieder was?? 🙄

    Ja, du übersiehst, daß du hier der/die einzige warst, der den Begriff "binäre Addition" verwendet hat - das ist keine Addition, sondern eine sog. "Disjunktion".



  • 0 | 0 bleibt 0
    0 | 1 wird 1
    1 | 0 wird 1
    1 | 1 bleibt 1 (es gibt keinen Übertrag)



  • ok, jetzt hab ich's wirklich.

    Keine Ahnung, wo sich mein Köpfchen wieder dieses Wort "Addition" hergezaubert hat, stand tatsächlich nicht da. Wird Zeit, dass Feierabend kommt *ggg*

    Euch allen noch einen schönen Tag !!


Log in to reply