#define VERSION "Ver. 201804011155" //"Ver. __CENTURY__ __YEAR__ __MONTH__ __DAY__ __HOUR__ __MINUTE__" // Diese Version ist vom ersten April 5 vor Zwölf ;-)
Der Präprozessor macht mir gerade zu schaffen bei der Zuweisung der Pin
Change Interrupts:
Lass solche Tricks besser sein. Sie machen früher oder später Probleme,
spätestens wenn jemand damit weiter arbeiten muss, der sich mit den
zahlreichen Haken und Ösen nicht auskennt.
Viel mehr als einfache Textersetzungen halte ich für nicht ratsam.
SG schrieb:> Ich lerne gerade Arduinos und C.> Gibt es ein Tutorial was ein paar "trickreiche" Beispiele zum> Präprozessor verrät?> Oder erwarte ich da vielleicht zuviel?
Erstens:
Arduino ist C++, und nicht C
Zweitens:
Die C++ Entwickler haben sich große Mühe gegeben, und werden das
fortsetzen, die Nutzung des Präprozessors möglichst unnötig zu machen.
Drittens:
Du buddelst auf der falschen Baustelle.
Der Präprozessor lenkt dich nur vom (C++) lernen ab.
-------
OK, ich habe Verständnis dafür, wenn man die Fähigkeiten des
Präprozessors kennenlernen will.
Aber danach kannst du 90% direkt wieder vergessen.
Denn das wird dir eher im Wege rum stehen, als nutzen.
SG schrieb:> Gibt es ein Tutorial was ein paar "trickreiche" Beispiele zum> Präprozessor verrät?
Die meisten trickreichen Verwendungen des Präprozessors haben einen ganz
bestimmten Grund. Meist handelt es sich um üble Hacks, um sich um
bestimmte Probleme herumzuarbeiten - es geht eher selten darum, sie zu
lösen.
> Der Präprozessor ist ja nicht gerade umfangreich was den Befehlssatz> betrifft.
Der Präprozessor macht ziemlich stupide Textersetzung, mehr nicht. Die
meiste höhere Funktionalität ergibt sich erst im Zusammenspiel mit der
späteren Optimierung durch den Compiler.
SG schrieb:> Wie ist es möglich die "Version" aus Datumscode (vielleicht sogar der> Datei) zusammenzusetzen?
Der Präprozessor kennt immerhin das aktuelle Datum und die aktuelle
Uhrzeit. Zusammenbauen kannst du die wie folgt:
1
#define HEUTE (__DATE__ " " __TIME__)
Wenn dir das Format nicht gefällt, hast du allerdings Pech gehabt.
SG schrieb:> Der Präprozessor macht mir gerade zu schaffen bei der Zuweisung der Pin> Change Interrupts:
Das ist schon jenseits der Grenze, wo die Verwendung des Präprozessors
sinnvoll ist. Mach die ganzen Vergleiche einfach im C-Code. Da du am
Ende sowieso nur Compiletime-Konstanten vergleichst, sollte der Compiler
das sauber wegoptimieren. Lass ihn das einfach tun.
Den Präprozessor brauchst hierbei du nur, wenn du bestimmte Definitionen
nicht immer zur Verfügung hast (je nach AVR-Typ). Allerdings solltest du
nach AVR-Typ selektieren, nicht nach der Implikation daraus.
Hallo.
Wie ich jetzt herausgefunden habe sind die folgenden Makros im
Assembler-Präprozessor vordefiniert:
_YEAR_, _MONTH_, _DAY_, _HOUR_, _MINUTE_, _SECOND_http://www.microchip.com/webdoc/avrassembler/avrassembler.wb_preprocessor.Pre-defined_macros.html
Im C-Standard sind die vorgenannten Makros nicht definiert, nur
_DATE_, _TIME_.
Im folgenden Link hat das auch jemand angeprangert:
https://www.avrfreaks.net/comment/1350721#comment-1350721
Wie krank ist das denn?
Wenn ich eins hasse ist es Ignoranz gekoppelt mit Dummheit!
Wie ist es dann möglich mit dem Präprozessor in C einen Datumsstempel
"YYYYMMDD" und einen Zeitstempel "HHMMSS" (einfach) zu generieren?
Grüße
SG
SG schrieb:> Wie krank ist das denn?
Tja, das passiert halt, wenn man sich an Standards hält, anstatt die
Wünsche einer beliebigen Zufallsperson ohne Ahnung...
SG schrieb:> Wenn ich eins hasse ist es Ignoranz gekoppelt mit Dummheit!
Dabei ist Selbsthass doch so ungesund...
Du verwechselst übrigens zwei Programme (nämlich Atmels AVR-Assembler
und gnu-as). Die haben miteinander nur wenig gemeinsam, eigentlich sogar
garnichts. Und was Atmel mit ihrem Assembler macht, ist ihre Sache - was
der GCC macht, nicht. Denn da gibt's nen Standard.
SG schrieb:> Wie ist es dann möglich mit dem Präprozessor in C einen Datumsstempel> "YYYYMMDD" und einen Zeitstempel "HHMMSS" (einfach) zu generieren?
Garnicht. Falsches Werkzeug.
Hallo.
S. R. schrieb:> Dabei ist Selbsthass doch so ungesund...
Bitte keine Beleidigungen oder Angriffe auf meine Person.
Bitte sachlich bleiben.
S. R. schrieb:> Garnicht. Falsches Werkzeug.
Ich suche Lösungen.
Was ist das richtige Werkzeug?
Grüße
SG
> S. R. schrieb:>> Garnicht. Falsches Werkzeug.>> Ich suche Lösungen.> Was ist das richtige Werkzeug?
Die Buildumgebung definiert dies und übergibt von aussen Defines mit
Schalter "-D" dem Compiler.
Hallo.
Nochmal zur Verdeutlichung meiner Anforderung:
Ich sehe ein, daß für ausgelieferte Software eine Versionsnumer sinnvoll
ist. Darum geht es mir aber nicht.
Während der Entwicklungszeit ist es doch sehr vorteilhaft zu wissen und
auf dem Display der Applikation zu lesen, welcher Stand (Datum und
Uhrzeit) gerade im µC läuft (wird nach dem Einschalten kurz angezeigt).
Ich finde es drängt sich förmlich auf die Versionsnummer in dieser Zeit
mit einem Datums- und Zeitstempel (automatisiert durch den Präprozessor)
zu belegen.
Ist doch einfach und sinnvoll.
Buildumgebung ist die Arduino IDE.
Ich werde dann wohl _DATE_, _TIME_ nutzen.
Danke für die angebotene Hilfe.
Trotz der nicht gelösten Fragen hilft eine Diskussion zu mehr Einsicht.
Ein Forum dient der Effizienz.
Nachtrag: Ich bitte zukünftig darum sachlich zu bleiben.
Solche Antworten von S. R. empfinde ich als verletzend.
Wer keine Hilfe und Unterstützung geben will oder kann soll doch einfach
nicht antworten.
Grüße
SG
I <3 Makefiles hat die richtige Antwort gegeben. Der Zeitstempel-String
soll außerhalb vom Compiler/Präprozessor erzeugt werden und als
Definition (mit dem Parameter -D) an gcc übergeben werden.
Deswegen verwendet man normalerweise ein Makefile oder ein anderes Build
Script, wo man solche Sachen einbauen kann. Nur im Zeitalter der IDE
sind Build Scripte aus der Mode gekommen.
Aber: Alle mir bekannten AVR Entwicklungsumgebungen unterstützen
Makefiles immer noch. man muss sie nur erstellen und einbinden.
Kopiervorlagen findet man reichlich im Internet.
Unter Linux konstruiert man solche Zeitstempel ganz einfach mit dem Date
Befehl. Aus dem Bauch heraus würde ich erwarten, dass die Powershell von
Windows das auch irgendwie kann. Ansonsten wäre das nun ein guter Grund,
mal Linux auszuprobieren. Dort fühlt sich gcc sowieso mehr zuhause und
läuft auch viel schneller.
SG schrieb:>> Garnicht. Falsches Werkzeug.> Ich suche Lösungen.
Wie ich bereits schrieb, der Präprozessor ist geeignet für Workarounds,
nicht für Lösungen.
SG schrieb:> Solche Antworten von S. R. empfinde ich als verletzend.
Tschuldigung, du hast da aber eine absolute Steilvorlage hingelegt.
Zumal ich dir schon vorher deutlich beschrieben hatte, was geht und was
nicht.
Jemanden als dumm und ignorant zu beschimpfen, obwohl er nur das getan
hat, was er tun musste, ist selbst dumm und ignorant.
> sachlich
Wenn es dir nur um ein "dieses Build war von $TAG, $UHRZEIT" geht, dann
kann der Präprozessor das. Ansonsten gehört sowas in die Buildumgebung
(denn nur die kann automatisiert auch git-Hashes oder svn-Revisionen
auslesen), und zu guter Letzt kannst du den Präprozessor-String auch im
Code parsen.
Aber das wurde dir alles schon genannt.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang