(gelöst) bitweise verknüpfung
-
Hallo,
ich habe gerade folgendes festgestellt und wollte wissen wie man das vieleicht verhindern kann.
#define item_0 1 #define item_1 2 #define item_2 4 ... #define item_11 2048 #define item_mask item_0 | item_4 | item_10 ... void Klasse::meine_schoene_funktion(int status) { //status is zusammengesetzt aus den obigen defines oder 0 if((status & item_mask) != 0) { tu_etwas_ganz_tolles() } }Die Funktion "tu_etwas_ganz_tolles()" wird bei mir auch ausgeführt wenn status 0 ist. Danke für die Aufmerksamkeit.
Gruß
eviluser
-
Lösung: Verzichte auf '#defines', die tun in Deinem Code nicht das, was Du erwartest.
Konstanten kannst Du (*solltest* Du) unter C++ per 'const' (oder als 'enum') deklarieren:
enum items { item_0 = 1, item_1 = 2, item_2 = 4, item_11 = 2048, item_mask = item_0 | item_4 | item_10 };
-
Wenn die Zeile:
if((status & item_mask) != 0)im Präprozesser aufgebaut wird dann kommnt:
if((status & item_0 | item_4 | item_10) != 0)
raus. Was wohl nicht deine Vorstellung entsprechen dürfte.
Wenn ich dich richtig verstehe, dann musst Du nur item_mask richtig klammern.
#define item_mask (item_0 | item_4 | item_10)
Babbage
-
Verwende Makros nur wo es unbedingt nötig ist
Du zeigst den klassischen Fall auf, in dem man lieber darauf verzichtet.
Makros sind dumme Textersetzungen, für Konstanten entweder enum oder const verwenden.Durch die Textersetzung passiert folgendes:
Aus...if((status & item_mask) != 0)...wird...
if((status & 1 | 2 | 4) != 0)Und ich hoffe du findest deinen Fehler jetzt

cu André
P.S: Der Vorteil an Foren ist das mehrere paralell Texte einfügen können, der Nachteil ebenso ;)... Oder kurz gesagt... zu Spät
-
Oder so.
Naja immerhin war ich zweiter.
-
Hallo,
if(0 & 1 | 2 | 1024)...Genau das ist passiert. Mit der Klammerung hat es funktioniert. Das Problem bei der enum ist, ich müsste alle 4095 Möglichkeiten anlegen. Ist mir einbischen zu viel. Konstanten hören sich ganz gut an.
Vielen Dank!!
Gruß
eviluser
-
eviluser schrieb:
Das Problem bei der enum ist, ich müsste alle 4095 Möglichkeiten anlegen. Ist mir einbischen zu viel. Konstanten hören sich ganz gut an.
Wieso müsstest du bei einem enum alle Fälle abdecken? Du musst nicht zwangsweise den Enum zum speichern nehmen, wenn du ein int verwendest geht das genauso (Sprich die enums nur als benannte konstanten benutzen, was du auch mit Konstanten machen kannst).
enum Test { T1 = 1, T2 = 2, T3 = 4 }; int value = T1 | T3;cu André