Forum: Compiler & IDEs Präprozessor frage...


von Chriss (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Chriss (Gast)


Lesenswert?

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;

von Karl H. (kbuchegg)


Lesenswert?

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.

von Chriss (Gast)


Lesenswert?

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