Forum: Mikrocontroller und Digitale Elektronik compiler akzeptiert keine binärzahlen 0b001010


von Sonke A. (soeni)


Lesenswert?

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?

von Purzel H. (hacky)


Lesenswert?

Auf Hex umstellen. Allenfalls gibt's eine alternative Schreibwaise wie 
"%01010101" oder 10010100b.

von Michael U. (amiga)


Lesenswert?

Hallo,

ein Glück, daß es nur einen Compiler in einer Version auf der Welt 
gibt...

Gruß aus Berlin
Michael

von tobi (Gast)


Lesenswert?

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.

von Ben _. (burning_silicon)


Lesenswert?

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.

von Sonke A. (soeni)


Lesenswert?

er verwendet avr gcc 4.20 auf einem mac (OS 10.5.8)

von Sven P. (Gast)


Lesenswert?

Hier gcc (GCC) 4.3.2 auf Kubuntu, Binärdarstellung funktioniert 
einwandfrei. Übersetzt du zufällig mit -ansi oder --std=c89 oder sowas?

von tobi (Gast)


Lesenswert?

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.

von Ben _. (burning_silicon)


Lesenswert?

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.

von Sonke A. (soeni)


Lesenswert?

und beim Thema, hat da noch jemand vorschläge zu?

von tobi (Gast)


Lesenswert?

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.

von Ungast (Gast)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Sven P. (Gast)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

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.

von yalu (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.