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).aspxEr 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.
-
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.htmlIn C++ kann allerdings eine Zahl mit dem Wert 0 implizit in
false
, bzw. jede Zahl ungleich 0 implizit intrue
, 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
-