Hi, bei nem Kumpel (MAC) funktioniert das kompilieren meines Quelltextes nicht, welcher bei mir ordentlich durchläuft. Ich verwende die Binärschreibweise 0b10101010 Ich hab mal was von makros gehöhrt, die man dazu braucht aber warum geht das bei mir und bei ihm nicht, ich benutze doch auch keine makros jedenfalls nicht absichtlich. Wie kann man das bei ihm zum laufen bringen?
Auf Hex umstellen. Allenfalls gibt's eine alternative Schreibwaise wie "%01010101" oder 10010100b.
Hallo, ein Glück, daß es nur einen Compiler in einer Version auf der Welt gibt... Gruß aus Berlin Michael
Die 0b... Schreibweise ist nicht Standardkonform und daher nicht portabel. Dazu kommt noch das diese Schreibweise (bis auf seltene Ausnahmen) absolut tötlich für die Lesbarkeit eines Quellcodes ist.
na absolut tödlich ist sie nicht. wenn ich ein bitmuster an einem port brauche verwende ich diese schreibweise auch, weil man da direkt den zustand der einzelnen pins erkennen kann. ich verwende das manchmal sogar beim schreiben auf die control-ports weil ich zu faul bin irgendwelche abkürzungen für die "bitnamen" zu suchen die ich mal wieder vergessen habe.
er verwendet avr gcc 4.20 auf einem mac (OS 10.5.8)
Hier gcc (GCC) 4.3.2 auf Kubuntu, Binärdarstellung funktioniert einwandfrei. Übersetzt du zufällig mit -ansi oder --std=c89 oder sowas?
Ben _ schrieb: > wenn ich ein bitmuster an einem port > brauche verwende ich diese schreibweise auch, weil man da direkt den > zustand der einzelnen pins erkennen kann. Bei sowas gehts vllt noch, wobei man das bei Hex nach sehr kurzer Zeit auch direkt sehen kann. Das einzige mal wo ich diese Schreibweise verwendet hab war das ausnullen der oberen 6 Bits eines 16-Bit Wertes. Ben _ schrieb: > ich verwende das manchmal > sogar beim schreiben auf die control-ports weil ich zu faul bin > irgendwelche abkürzungen für die "bitnamen" zu suchen die ich mal wieder > vergessen habe. Für sowas muss man eh ins Datenblatt gucken und dann hat man dort doch auch die Bitnamen oO Oder kennst du die entsprechenden Ports/Register alle auswendig? Naja jedenfalls hat es mich bis jetzt immer angekotzt wenn ich eine Software von einem anderen benutzen musste und dort die 0b... Schreibweise verwendet wurde. War immer mehr Arbeit als sprechende Namen für bestimmte Bits.
liegt wohl auch daran, daß ich zu 99,9% der einzige bin der in meinem quellcode rumwerkelt. wenn ich quellcode weitergebe (etwa PHP) dann versuch ich schon das verständlich zu schreiben. ist aber nur seeeehhhr selten der fall, bei der µC programmierung denke ich bislang nicht, daß irgendwer mal meinen quellcode braucht oder verstehen will. ansonsten wäre es halt auch eine frage ob sich's für mich lohnt. wenn sich irgendwer sein projekt ein wenig was kosten läßt (was ich heute auch als seeeehhr unwahrscheinlich ansehe) dann bekommt er auch vernünftigen quellcode, logisch. bei den control-registern hab ich oft situationen, daß ich direkt sehe ich brauche nur die bits x und y auf 1, den rest 0. dann tippt sich 0b... schneller als sich vielleicht noch einen fehler bei den "bitnamen" einzufangen. die HEX schreibweise nutz ich auch, etwa wenn nur ein bit zu setzen ist.
und beim Thema, hat da noch jemand vorschläge zu?
Sonke A. schrieb: > und beim Thema, hat da noch jemand vorschläge zu? Antworte erstmal hier drauf Sven P. schrieb: > Hier gcc (GCC) 4.3.2 auf Kubuntu, Binärdarstellung funktioniert > einwandfrei. Übersetzt du zufällig mit -ansi oder --std=c89 oder sowas? Ansonsten musst du bei dem Compiler halt mal gucken ob der überhaupt diese arstellung unterstützt. Sollte ja irgendwo auf der Homepage zu finden sein.
der "original" Gnu AVR-GCC kann die 0bXXXX-Schreibweise nicht, das ist Teil der WINAVR-Patches. Manche Packager wenden diese auch für Linux-Distros an, was ja auch Sinn macht, dort sind auch etliche (wichtige) Bugfixes mit dabei. Also, Lösung: Dem Kerl, der den AVR-GCC für den Mac verteilt, eine nette Mail schicken: er möge doch bitte die WINAVR-Patches mit anwenden.
Ungast schrieb: > der "original" Gnu AVR-GCC kann die 0bXXXX-Schreibweise nicht, das ist > Teil der WINAVR-Patches. > Manche Packager wenden diese auch für Linux-Distros an, was ja auch Sinn > macht, dort sind auch etliche (wichtige) Bugfixes mit dabei. Bei meinem GCC handelt es sich nicht um den AVR-GCC, sondern um den normalen GCC. Aber mein AVR-GCC (Kubuntu) kommt auch mit den Bitmasken klar.
> Bei meinem GCC handelt es sich nicht um den AVR-GCC, sondern um den > normalen GCC. Aber mein AVR-GCC (Kubuntu) kommt auch mit den Bitmasken > klar. Wie schon gesagt wurde, ist das nicht ISO-C-konform und noch nicht mal Teil des GCC. Wenn man also portablen Code schreiben will, darf man es nicht benutzen.
Rolf Magnus schrieb: >> Bei meinem GCC handelt es sich nicht um den AVR-GCC, sondern um den >> normalen GCC. Aber mein AVR-GCC (Kubuntu) kommt auch mit den Bitmasken >> klar. > > Wie schon gesagt wurde, ist das nicht ISO-C-konform und noch nicht mal > Teil des GCC. Wenn man also portablen Code schreiben will, darf man es > nicht benutzen. ISO-C ist es nicht, aber es ist Teil des GCC. http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html
Sonke A. schrieb:
> er verwendet avr gcc 4.20 auf einem mac (OS 10.5.8)
Dann lebt er wohl in der Zukunft ;-)
Du meinst wahrscheinlich 4.2.0. Damals gab es die 0b-Syntax nur als
Patch, mittlerweile (4.3.x und 4.4.x) ist sie Bestandteil des
offiziellen GCC-Releases. Dein Kumpel braucht also nur zu patchen oder
upzudaten.
Sonke A. schrieb: > Ich hab mal was von makros > gehöhrt Ach ja, falls dein Kumpel nicht updaten möchte/kann/darf: Hier ist das Makro, von dem du gehört hast:
1 | #define B(x) \
|
2 | 0##x & 0x01 | \
|
3 | (0##x>> 2) & 0x02 | \
|
4 | (0##x>> 4) & 0x04 | \
|
5 | (0##x>> 6) & 0x08 | \
|
6 | (0##x>> 8) & 0x10 | \
|
7 | (0##x>>10) & 0x20 | \
|
8 | (0##x>>12) & 0x40 | \
|
9 | (0##x>>14) & 0x80
|
Danach kannst du schreiben:
1 | unsigned char a = B(10101010); |
Mit dem richtigen Editor sind die 0b-Konstanten auch ganz fix in die B-Makroaufrufe konvertiert. Beim Vim geht das bspw. mit dem Befehl
1 | :%s/\<0b\([01]\+\>\)/B(\1)/g |
Wenn die Konvertierung öfters benötigt wird, geht es auf ähnliche Weise auch nichtinteraktiv mit dem Streameditor sed. Man könnte den Aufruf sogar ins Makefile mit einbauen, so dass die C-Dateien beim Kompilieren automatisch durch den Sed geschleust werden.
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.