problem mit #define

#2952630
Lesenswert?
• ▲
▼
D. Kirschner schrieb:
> Hallo, ich habe ein problem mit "#define"
>
> ich will mehrere PINs und PORTs definieren. wie kann man den das machen?
>

Ich denke, dein Problem liegt ganz woanders:
Dir ist nicht klar, was ein #define eigentlich macht.

Ein #define ist nichts anderes als ein Textersatz, den der Compiler (der 
Präprozessor) durcchführt, anstatt das du das im Editor mit 
Suchen&Ersetzen machst. Mehr steckt da nicht dahinter. Text "A" wird 
durch Text "B" ersetzt.

D.h. wie dein #define auszusehen hat, richtet sich in erster Linie nach 
der verwendenden Stelle. Wenn die verwendende Stelle in letzter 
Konsequenz so aussehen soll

   i = 8 * 60;

und du anstelle der 60 einen 'stärkeren' Hinweis im Code haben möchtest, 
dass es sich bei dieser Berechnung um Minuten handelt, dann kannst du 
definieren

#define MINUTEN * 60

und damit dann schreiben

    i = 8 MINUTEN;

Denn wenn du jetzt den Text 'MINUTEN' durch seinen Textersatz '* 60' 
tatsächlich austauschst, dann kommt da wieder das zu erzielende

    i = 8 * 60;
raus.


Mehr steckt nicht hinter einem #define.
Ok, nicht ganz. Man kann einem #define auch Argumente mitgeben, die es 
dann in den zu ersetzenden Text einbaut. So wird aus

#define MIN(x,y)   x < y ? x : y

und der verwendenden Stelle

    j = MIN( 8, 5 );

durch die Textersetzung und durch das ersetzen von x mit 8 und das 
ersetzen von y mit 5 dieser Text:

     j = 8 < 5 ? 8 : 5;

den sich dann der eigentliche C-Compiler zur Übersetzung vornimmt.


Das bedeutet auch:
Wenn du ein Makro schreiben willst, dann muss dir am Anfang klar sein, 
wie denn das Ergebnis aussehen soll. Ohne Benutzung eines Makros.

    if( irgendwas ) PORTC |= (1<<PC1); else PORTC &= ~(1<<PC1);

nachdem dieses klar ist, überlegst du dir, welchen Text du statt dessen 
an dieser Stelle haben willst. Und du überlegst dir, wie man das eine in 
das andere überführen kann, und zwar nur durch Textersetzungen, wobei 
einige Dinge aus der 'Zielanweisung' übernommen werden können.
Du möchtest zb. anstatt obigem gerne schreiben

     SWITCH_ERROR_LED( irgendwas );

dann muss deine Textersetzung daher diese Gestalt haben
1
#define SWITCH_ERROR_LED(x)   if(x) PORTC |= (1<<PC1); else PORTC &= ~(1<<PC1);

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.