Wie Flags abfragen?



  • Hallo,

    auf der Seite

    http://msdn.microsoft.com/en-us/library/ms709348(VS.85).aspx

    steht:

    wCaps

    Joystick capabilities The following flags define individual capabilities that a joystick might have:

    JOYCAPS_HASZ Joystick has z-coordinate information.
    ...

    Nun habe ich versucht dieses abzufragen mit:

    return (joyCaps.wCaps == JOYCAPS_HASZ);
    

    Dies scheint nicht zu funktionieren.
    (Gibt immer false aus, obwohl mein Joystick eine Z-Achse hat)
    Nun habe ich mit Google folgendes gefunden:

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

    Dies scheint zu funktionieren.
    (Zumindest gibt es true aus bei meinem Joystick der wiklich eine Z- Achse hat. Ich weiß aber nicht ob dies nicht einfach immer true liefert)

    Aber ich verstehe diesen Code nicht.

    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?



  • die abfrage

    (joyCaps.wCaps == JOYCAPS_HASZ)
    

    wäre richtig, wenn in wCaps nur JOYCAPS_HASZ enthalten wäre.
    da man flags aber miteinander (durch "|") verknüpfen kann wird dir mit == False zurückgegeben.

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

    ich weis jetzt auch nicht, ob der code den du da gefunden hast, wirkllich wo anwendung findet. denn mal rein schriftlich übersetzt würde der code heisen.
    ist in wCaps JOYCAPS_HASZ enthalten gleicher gleich JOYCAPS_HASZ (schwachsinn) 😉

    & heist, fragt in diesem fall ob JOYCAPS_HASZ in wCaps enthalten ist. und liefert true zurück wenn es enthalten ist, andernfalls false.

    richtig wäre

    (joyCaps.wCaps & JOYCAPS_HASZ)
    


  • Danke!

    Ich habe das jetzt so versatnden:
    joyCaps.wCaps enthält also eine Integer Zahl und mit dem & verknüpft man das Flag Bitweise mit der Zahl. So kann diese Zahl mit jedem Bit ein Flag steuern.
    Wenns passt gibts true sonst false.

    Stimmt das?



  • 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