Gast
#201139
Hallo, ich versuche, Makros für Bitmanipulationen zu erstellen. Ich arbeite mit dem C51 Compiler von Keil (Demo). Folgende Makros habe ich geschrieben: //Makros für CHAR-Variablen #define GETBIT(ucByte, ucBit) ((ucByte & ucBit) > 0 ? 1 : 0) #define CLRBIT(ucByte, ucBit) (ucByte &= ~ucBit) #define SETBIT(ucByte, ucBit) (ucByte |= ucBit) #define INVBIT(ucByte, ucBit) (GETBIT(ucByte, ucBit) == 1 ? CLRBIT(ucByte, ucBit) : SETBIT(ucByte, ucBit)) #define MODBIT(ucByte, ucBit, ucBitStatus) (ucBitStatus > 0 ? SETBIT(ucByte, ucBit) : CLRBIT(ucByte, ucBit)) Die Namen der Makros sind, hoffe ich, selbst erklärend. ucBit ist immer ein Wert 2 hoch n, wobei n die Nummer des gewünschten Bits ist. Realisiert habe ich dies durch Bitmasken, also Bit0 = B00000001, Bit1 = B00000010, Bit2 = B00000100, usw. Das Problem ist, das sie leider noch nicht richtig funktionieren. Das äussert sich z.B. dadurch, dass einige der Makros offenbar in der Lage sind, eine Variable zu ändern, die gar nicht als Parameter übergeben wurde. Die fälschlicherweise geänderte Variable liegt direkt neben der zu manipulierenden im Speicher. Meine Vermutung ist, dass eventuell ein Type-Cast notwendig ist --> Kann es sein, dass Makros mit INT-Werten arbeiten?!? Kann sie bitte mal jemand überprüfen? Oder vielleicht hat jemand fertige Makros, die funktionieren? Makros für INT und LONG sind auch willkommen! Bräuchte halt alle genannten Funktionen, also Setzen, Löschen, Invertieren, Abfragen und Modifizieren (= übergebenen Bit-Wert zuweisen, siehe MODBIT). Falls mir jemand funktionsfähige Makros zur Verfügung stellen kann, wäre ich dankbar. Möchte allerdings trotzdem wissen, warum meine Makros nicht tun, sonst ist ja nix gelernt grins Danke Gruß Ralf