Wie Flags abfragen?



  • trauerspiel hier lol. was is schlimmer die frage oder @artifakts antwort!? bitte befasst euch nicht mt winapi wenn ihr noch ned mal bit operationen beherscht thx



  • wegfahrer schrieb:

    ...bitte befasst euch nicht mt winapi wenn ihr noch ned mal bit operationen beherscht thx

    Wirklich hilfreicher Beitrag!



  • wegfahrer schrieb:

    trauerspiel hier lol. was is schlimmer die frage oder @artifakts antwort!? bitte befasst euch nicht mt winapi wenn ihr noch ned mal bit operationen beherscht thx

    Ich denke hier muß es eher heißen:

    enable(Sarkasmus);
    cout << "Ein wirklich hilfreicher Beitrag.";
    disable(Sarkasmus);
    


  • Was gibt es denn an der Frage zu meckern?

    Der Fragesteller hat Google bemüht:

    Nun habe ich mit Google folgendes gefunden

    Er hat den richtigen MSDN Eintrag für sein Problem gefunden:
    http://msdn.microsoft.com/en-us/library/ms709348(VS.85).aspx

    Er hat selbst versucht eine Lösung zu entwickeln:

    return (joyCaps.wCaps == JOYCAPS_HASZ);
    

    Er hat gemerkt, dass diese nicht funktioniert:

    Dies scheint nicht zu funktionieren

    Er hat mit Google eine andere Lösung gesucht:

    return ((joyCaps.wCaps & JOYCAPS_HASZ) == JOYCAPS_HASZ);
    

    Obwohl diese für ihn anscheinend funktioniert bemüht er sich zu verstehen warum diese funktioniert:

    Dies scheint zu funktionieren.
    Aber ich verstehe diesen Code nicht.

    Er stellt dafür sinvolle Fragen:

    Wie funktioniert dies? (Warum muß man das Flag mit dem Element mit & verknüpfen?)
    Und wie kommt man darauf es so zu machen?
    Und ist dies überhaupt richtig so?

    Das ist weit mehr als die meisten Fragensteller hier tun!

    @rT!f@Ct bemüht sich eine passende Antwort zu geben und erläutert sogar seine Vorstellungen zu dem Problem.

    Und dann bekommt er eine so unqualifizierte, unnütze Antwort:

    wegfahrer schrieb:

    trauerspiel hier lol. was is schlimmer die frage oder @artifakts antwort!? bitte befasst euch nicht mt winapi wenn ihr noch ned mal bit operationen beherscht thx

    Da kann man sich echt fragen, was hier das Trauerspiel ist.


  • Administrator

    Um mal einen hilfreichen Beitrag zu geben. Der Operator & gibt nicht true oder false zurück, sondern einen Wert. Sucht mal nach Bitwise and oder lest euch das hier durch:
    http://www.cplusplus.com/doc/boolean.html

    In C++ kann allerdings eine Zahl mit dem Wert 0 implizit in false , bzw. jede Zahl ungleich 0 implizit in true , umgewandelt werden.

    Wenn der Rückgabewert also ein bool ist, so sind beide folgende Lösungen richtig:

    return (joyCaps.wCaps & JOYCAPS_HASZ) == JOYCAPS_HASZ; // Gibt true oder false zurück
    // ...oder...
    return joyCaps.wCaps & JOYCAPS_HASZ;                   // Gibt eine Zahl ungleich 0 oder 0 zurück,
                                                           // Was implizit in true oder false umgewandelt werden kann.
    

    Es hat also meistens mehr mit dem Programmierstil zu tun, was man sich denn nun aussucht.

    Grüssli



  • Da fällt mir ein:

    Wenn du einen Rückgabetyp bool haben möchtst, müßte auch dieses hier funktionieren:

    return (joyCaps.wCaps & JOYCAPS_HASZ)!=0;
    


  • Eine kurze Erläuterung:

    if (joyCaps.wCaps & JOYCAPS_HASZ)
    

    Prüft ob "joyCaps.wCaps" und "JOYCAPS_HASZ" mindestens(!) ein identisches Bit beinhalten. Solange JOYCAPS_HASZ dabei nur ein Bit gesetzt hat, ist das identisch mit

    if ((joyCaps.wCaps & JOYCAPS_HASZ) == JOYCAPS_HASZ)
    

    Sobald das zu überprüfende Flag aber eine Kombination von Flags ist z.B.:

    const unsigned int JOYCAPS_HAS_Y_AND_Z = JOYCAPS_HAS_Y | JOYCAPS_HAS_Z;
    

    Wird es problematischer. Wird der if-Zweig bei diesem Beispiel ausgeführt?

    joyCaps.wCaps = JOYCAPS_HASZ;
    if (joyCaps.wCaps & JOYCAPS_HASY_AND_Z)
    

    Die Antwort ist: Ja. "joyCaps.wCaps" und "JOYCAPS_HASY_AND_Z" haben mindestens ein Bit gemeinsam (Das JOYCAPS_HASZ-Bit). In diesem Fall hilft nur die zweite Abfrageform:

    joyCaps.wCaps = JOYCAPS_HASZ;
    if ((joyCaps.wCaps & JOYCAPS_HASY_AND_Z) == JOYCAPS_HASY_AND_Z)
    

    Da diese Form überprüft, ob alle(!) Bits enthalten sind. Folglich wird der if-Zweig nicht ausgeführt.

    Gruß
    Don06



  • Don06 schrieb:

    Eine kurze Erläuterung:

    if (joyCaps.wCaps & JOYCAPS_HASZ)
    

    Prüft ob "joyCaps.wCaps" und "JOYCAPS_HASZ" mindestens(!) ein identisches Bit beinhalten. Solange JOYCAPS_HASZ dabei nur ein Bit gesetzt hat, ist das identisch mit

    if ((joyCaps.wCaps & JOYCAPS_HASZ) == JOYCAPS_HASZ)
    

    nö, der eine ausdruck liefertn bool der andere nich 🙄



  • noobalert schrieb:

    nö, der eine ausdruck liefertn bool der andere nich 🙄

    bool? In C gibt es kein bool. Der Ausdruck hat den Typ int.



  • die seite heißt c-plusplus.net



  • rofl@volldepp schrieb:

    die seite heißt c-plusplus.net

    schlechtestes Argument ever 🙄 👎


Anmelden zum Antworten