Nabend und frohes Jahr 2003! Langsam fängt es mich an zu stören dass der GCC keine Zahlen in Binärschreibweise unterstützt... Ich habe mir, wie viele andere wohl auch, per #define b00000000 0 #define b00000001 1 #define b00000010 2 #define b00000011 3 [...] abhilfe geschaffen, lieber währe es mir jedoch wenn der Syntax der selbe währe wie bei den Hex-Zahlen: z.B.: 0b00000010 Ich kenne mich mit den Compiler selber nicht so gut aus, aber vielleicht kann man ihm das in irgendeiner File begreiflich machen?! Per #define geht es ja leider nicht, wegen der führenden "0"..
Man kann Binärzahlen mit folgendem Macro schreiben: #define BIN8(b7,b6,b5,b4,b3,b2,b1,b0) ((unsigned char)\ (b0 << 0)\ | (b1 << 1)\ | (b2 << 2)\ | (b3 << 3)\ | (b4 << 4)\ | (b5 << 5)\ | (b6 << 6)\ | (b7 << 7)) z.B.: x = BIN8(0,0,0,0,0,0,1,0); Peter
Da gab es auch mal etwas mit einem Bitfeld in Kombination mit einem Makro. Aber so richtig begeistern kann dies alles nicht. Eigentlich schade. Gibt es hier wirklich keine elegantere Lösung? Notker
Hallo Notker, ist alles reine Gewöhnungssache, ich komme mit meinem Macro ganz gut zurecht. Wenn Du unbedingt Deine eigenen Syntaxregeln aufstellen willst, must Du eben den C-Compiler selber schreiben. Jede Sprache hat nun mal ihre Unterschiede und die muß man lernen. Peter
Interessant fände ich zuweilen 0b als Prefix auch, andere Compiler können wohl sowas, und es scheint auch dem Standard nicht komplett zu widersprechen, das als Erweiterung zu haben. Ändern müßte man die Funktion cpp_classify_number() in der Datei cppexp.c, falls das jemand mal tun will... ;-)
Das mit 0b wäre schon nett, aber wenn es dann irgendwann Programme gibt die sich nur noch mit gepatchten GCCs kompilieren lassen kann das ja auch nicht Sinn der Sache sein... oder wie stehen die Chancen dass man sowas in den offiziellen GCC aufnehmen würde? Freunde von Monster-Makros können sich hiermit behelfen (bei Bedarf verlängern): #define BIN(x) \ ((x%10)\ |(((x/10)%10)<<1)\ |(((x/100)%10)<<2)\ |(((x/1000)%10)<<3)\ |(((x/10000)%10)<<4)\ |(((x/100000)%10)<<5)\ |(((x/1000000)%10)<<6)\ |(((x/10000000)%10)<<7)\ )
Ob nun "mitdenkendes" Makro oder die Liste von defines... Das ist Jacke wie Hose. Nicht dass es ja garnicht geht, mir geht es halt nur um den letzten Schliff, das "0b" davor. Wenn man für den PC programmiert ist es relativ trivial, da man es eigentlich niemals braucht... aber bei den Mikrocontrollern sieht es da ja grundlegend anders aus...
Hi Andreas, super Macro, werde ich gleich in meine common.h kopieren ! Vielleicht auch eine Version geteilt in 2 Vierergruppen, damit sichs besser lesen läßt. Peter
Wenn schon mit 0b, dann nur so, daß es auch im offiziellen gcc drin ist, alles andere wäre in der Tat Unsinn. Ob die gcc-Entwickler sowas akzeptieren würden, weiß ich nicht, aber sie waren in der Vergangenheit großzügig mit eigenen Erweiterungen, die über den Standard hinausgehen, insofern kann ich mir das schon vorstellen (zumal es ja Präzedenzfälle gibt, irgendein Intel-Compiler glaub ich).
Naja, das problem ist mir noch nicht so einsichtig. man kann binär->hex doch relativ schnell im kopf rechnen. besonders, wenn man das andauernd braucht sollte sich das doch schnell üben.
cpp_classify_number() gibt's in gcc 3.2 nicht, die relevanten Stellen sind lex_number() (Zeile 880) in c-lex.c und parse_number() (Zeile 116) in cppexp.c. Der Patch für's 0b-Prefix ist im Anhang (gcc 3.2).
Da gcc 3.2 sowieso die aktuelle Version von avr-libc nicht mehr unterstützt, was willst Du ihn da erst noch patchen? Im übrigen sollte wohl auch die Ausschrift "illegal digit in octal number" (oder so ähnlich) noch angepaßt werden. ;-) Gedanklich war ich in den 3.3er Quellen auch schon so weit vorgedrungen, ich hatte es nur noch nicht ausprobiert. Irgendwo müßte man natürlich dann auch noch die Doku updaten, bevor man das zu GNU schicken kann.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.