Hey Leute.. Will ein Makro setzen, abhängig von einem anderen. #define start_timer() TCCR1B |= (1<<CS10); #if start_timer() == TCCR1B |= (1<<CS10); #define USED_PRESCALER 1 #elif start_timer() == TCCR1B |= (1<<CS11); #define USED_PRESCALER 8 #elif start_timer() == TCCR1B |= (1<<CS11) | (1<<CS10); #define USED_PRESCALER 64 #elif start_timer() == TCCR1B |= (1<<CS12); #define USED_PRESCALER 256 #endif was mache ich da falsch? schöne grüße
> was mache ich da falsch?
Du willst einen Zeichenkettenvergleich. Das geht nicht. Der
Präprozessor kann nur Ganzzahl-Arithmetik. Makros mit Argumenten
(also mit Klammern) kann er überhaupt nicht selbst benutzen für
die Arithmetik.
Wie könnte man das ganze dann umschreiben das es so funktioniert? Hab mir diesen stil aus nem sourcecode abgeschaut. finde ich deshalb cool weil es die übersichtlichkeit erhöht. Was ich da genau mache ist mir nicht unbedingt klar. vl kann mir das jemand noch genau erklären. #define start_timer() TCCR1B |= (1<<CS10); so kann ich diesen aufruf dann mit start_timer(); ausführen... geht das ganze auch ohne der klammer? so: #define start_timer TCCR1B |= (1<<CS10); und dann ausführung mit: start_timer;
Chriss wrote: > Wie könnte man das ganze dann umschreiben das es so funktioniert? > > Hab mir diesen stil aus nem sourcecode abgeschaut. > finde ich deshalb cool weil es die übersichtlichkeit erhöht. > > Was ich da genau mache ist mir nicht unbedingt klar. vl kann mir das > jemand noch genau erklären. > > > #define start_timer() TCCR1B |= (1<<CS10); > > so kann ich diesen aufruf dann mit > start_timer(); ausführen... Ja. Nimm aber den ; hier weg #define start_timer() TCCR1B |= (1<<CS10); ^ > > > geht das ganze auch ohne der klammer? so: > #define start_timer TCCR1B |= (1<<CS10); > und dann ausführung mit: > > start_timer; Sicher. Der Präprozessor macht nur Textersetzungen. Dort wo jetzt start_timer; steht, ersetzt er den Text "start_timer" mit dem Text, den du im #define angegeben hast. Da entseht dann TCCR1B |= (1<<CS10);; da draus (Und jetzt siehst du auch, warum du im Makro den ; weglassen solltest) Du könntest zb Folgendes machen #define PRESCALER_1 ( 1 << CS10 ) #define PRESCALER_8 ( 1 << CS11 ) #define PRESCALER_64 ( 1 << CS11 ) | ( 1 << CS10 ) #define PRESCALER_256 ( 1 << CS12 ) #define start_timer(x) TCCR1B |= (x) und benutzt das dann in der Form start_timer( PRESCALER_64 ); Wenn du selbst wieder mal Präprozessor spielst: start_timer durch den im Makro angegebenen Text ersetzen. Das Makroargument x wird dabei zu PRESCALER_64. Also liefert die Ersetzung: TCCR1B |= (PRESCALER_64); Nun ist aber PRESCALER_64 seinerseits wieder ein Makro. Dessen Ersetzung liefert den Text "( 1 << CS11 ) | ( 1 << CS10 )". Den anstelle von PRESCALER_64 eingesetzt, liefert dann TCCR1B |= (( 1 << CS11 ) | ( 1 << CS10 )); genau das, was du haben willst.
Karl heinz Buchegger <----- deine comments sind immer sehr genau erklärt.. BESTEN DANK für deine Mühen. Mach weiter so.... DANKE schöne Grüße
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.