Hallo, ich bin gerade auf Linux umgestiegen und mir gefällt die Einschränkung des neuen Compilers, dass ich keine Binären Zahlen (alla "0b") mehr verwenden kann, nicht, daher habe ich einen Präprozessor in Python geschrieben, mit dem man Binärwerte in den Quelldateien automatisch in Dezimalwerte umwandeln kann. Ich werde ihn mir noch in mein Makefile einbauen, damit ich mich darum nicht mehr zu kümmern brauche, ein vorläufiger Entwurf sieht so aus: [...] convert: @echo "Backup alter Source-Dateien machen..." mkdir ConvBackup cp $(PRJSRC) ConvBackup/ @echo "Konvertieren..." /pfad/zur/datei/bindec.py $(PRJSRC) >> /dev/null convbackupback: @echo "Backup zurück..." cp ConvBackup/* . rm -R ConvBackup/ [...] Wichtig ist dabei vor allem das Backup der Original Quelldateien, Binärwerte sind nunmal (vor allem bei Bitmasken, o.ä) einfach besser zu lesen, nicht vergessen dieses dann wiederherzustellen! Noch ein paar Anmerkungen: Leider hat das Programm (noch) keine Fehlererkennung, es unterstützt zudem nur exakt 8bit lange Binärwerte (z.B.: 0b10101010) und sie müssen auch genauso geschrieben werden, alles andere führt zu unerwünschten Ergebnissen. Aber das könnt ihr ja gerne ändern. Wäre super, wenn ihr verbesserte Versionen wieder hier einstellt! Natürlich kann ich keine Haftung für verlorene oder kaputte Dateien übernehmen...;-) Ich hoffe, irgendwer kann das Programm gebrauchen, viele Grüße, Daniel
Hallo Daniel, du solltest die binär-Werte besser prüfen. Ein Binärwert sieht so aus: [Trennzeichen]"0bxxxxxxxx"[Trenzeichen] mit x=0 oder 1 schick mal folgende Teststrings durch dein Programm: "a0babcefg" "0B10101010" "0b101010101010101010" Grüße Werner
> ich bin gerade auf Linux umgestiegen und mir gefällt die > Einschränkung des neuen Compilers, dass ich keine Binären Zahlen > (alla "0b") mehr verwenden kann, nicht, Das ist eigentlich keine Einschränkung, sondern der Normalfall. Das 0b... ist eine Nichstandard-Erweiterung. Ansonsten aber eine nette Idee. Übrigens kann man da in C++ auch mit Template-Metaprogramming was nettes machen. Das sieht dann z.B. so aus:
1 | #include <stdint.h> |
2 | #include <avr/io.h> |
3 | |
4 | template<uint64_t> |
5 | struct Bin |
6 | {
|
7 | static const uint64_t value = (N%10) + 2 * Bin<N/10>::value; |
8 | };
|
9 | |
10 | template<> |
11 | struct Bin<0> |
12 | {
|
13 | static const uint64_t value = 0; |
14 | };
|
15 | |
16 | int main() |
17 | {
|
18 | PORTB = Bin<10010101>::value; |
19 | }
|
Der Overhead dieser Lösung ist 0. Das ist eine einfache Version, die keine Prüfung der Ziffern auf 0 oder 1 macht, aber das wäre auch möglich. Solchen Code findet man dann auch leicht per Google.
Hi, was ich in diesem Zusammenhang auch schon gesehen habe sind Headerdateien in dieser Form: #define B00000000 0 #define B00000001 1 #define B00000010 2 #define B00000011 3 ... Das ist zwar nicht elegant aber dafuer garantiert portabel :) Gruss Tobias
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.