Hallo,
zur Zeit bin ich dabei, mich in die Dekodierung des DCF77-Signals
einzuarbeiten und bin bei der Suche nach Vorlagen auf Ulrich Radigs
Variante gestoßen, die eine Ausgabe auf das Terminal schreibt.
http://www.ulrichradig.de/home/index.php/avr/dcf77_uhrhttp://www.ulrichradig.de/home/uploads/File/AVR_DCF77/SourceCode.zip
Kann bitte mal jemand diese beiden Zeilen erklären?
in usart.h:
#define usart_write(format, args...) usart_write_P(PSTR(format) , ##
args)
in main.c:
usart_write("%i-%i-%i Time: %i:%i:%i Sync: %i Rx: %i \r",
day,mon,year,hh,mm,ss,flags.dcf_sync,flags.dcf_rx);
//Wait a schort time
mit freundlichem Gruß
Das mit den .. bzw. ## ist eine gcc-Erweiterung, die variable
Argumentanzahl auch für #defines erlaubt. Sinnvoll ist das im
wesentlichen für printf-Verwandte (wie das usart_write). Der erste
Parameter des Makros ist der Formatstring, alle weiteren Argumente
werden mit .. zusammengefasst und im Makrokörper mit ## wieder am Stück
verwertet.
Der gcc hat übrigens eine ganze Menge Erweiterungen. Solange man in der
gcc-Welt bleibt (beim AVR noch eher als sonst ;) ist es auch durchaus
sinnvoll, sich die mal zumindest anzuschauen.
http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
Das mit dem ../## fällt unter "Variadic Macros".
Christian S. schrieb:> in usart.h:> #define usart_write(format, args...) usart_write_P(PSTR(format) , ##> args)
Wichtig ist dabei, daß nach ## kein Zeilenumbruch erfolgt, also
Eine weitere GCC-Spezialität ist das Leerzeichen vor dem Komma. Es
bewirkt die Entfernung des nachfolgenden Kommas für den Fall, daß keine
weiteren Argumente folgen.
Damit funktioniert dann auch Code wie usart_write ("Hallo") der zu
usart_write_P (PSTR("Hallo")) expandiert (*) und eben nicht zu
usart_write_P (PSTR("Hallo") ,) was einen Compilerfehler nach sich zöge.
Variadische Makros gibt's auch ab C99, allerdings mit anderer Syntax.
(*) Der Übersichtlichkeit wegen ohne expandiertes PSTR Makro.
Danke für die Zuschriften. Na, da hat unser geschätzter Ulrich aber
mächtig in die Trickkiste gegriffen :-) Und eine Funkuhr mit einem
variadic macro innen drin hat auch nicht jeder...
Variadic Macros != vedische Mythen sind für mich ein neues
Experimentierfeld, für die man sich doch mal ein eigenes
Übungsprogramm gönnen könnte.
"Variadic Macros: Macros with a variable number of arguments. "
Für jedes
%i
soll anscheinend dann eine der aufgezählten Variablen
day,mon,year,hh,mm,ss,flags.dcf_sync,flags.dcf_rx
der Reihe nach eingesetzt werden, wobei in der Ausgabe noch zusätzlich
die Worte "Time:" "Sync:" "RX:" erscheinen sollen. Richtig?
Ich melde mich nochmals, wenn es neue Ergerbnisse gibt. Beispielsweise
könnte man direkt "AVR_DCF77/SourceCode.zip" einmal ausprobieren.
> //Wait a schort time
Den Tapsfühler habe ich zur Belustigung extra mit aus dem Quelltext
kopiert.
mit freundlichem Gruß
Christian S. schrieb:> Danke für die Zuschriften. Na, da hat unser geschätzter Ulrich> aber> mächtig in die Trickkiste gegriffen :-) Und eine Funkuhr mit einem> variadic macro innen drin hat auch nicht jeder...
Nun ja, das ist halt eine Möglichkeit, einen Quelltext auf verschiedene
Microcontroller anzupassen.
> Variadic Macros != vedische Mythen sind für mich ein neues> Experimentierfeld, für die man sich doch mal ein eigenes> Übungsprogramm gönnen könnte.
Ganz ehrlich: die Dinger gehören zu den C-Spezial-Schweinereien, die man
erst dann anschauen sollte, wenn man normales C mit all seinen Facetten
wirklich, wirklich, wirklich kann.
Oliver
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.