Forum: Compiler & IDEs Präprozessor und infix-operator


von Marco Schwalm (Gast)


Lesenswert?

Hallo erst mal.

Eine Frage bezüglich der Vereinfachung von Sourcecode. Gegeben sei das
Problem der Ansteuerung eines LCD-Displays mit einem AVR unter der
Programmiersprache C. Wird auf das LCD gelesen und geschrieben, so muss
z. B. zum Schreiben PORTC, für die Richtung DDRC, zum Lesen PINC und
für die Position im Byte PC2 angegeben werden. Das ganze definier ich
mir zur Vereinfachung folgendermassen:

#define  LCD_D4_OUT  PORTC
#define  LCD_D4_IN  PINC
#define  LCD_D4_DR  DDRC
#define  LCD_D4_DB  PC2,

um dann im eigentlichen Code z. B.. mit

sbi(LCD_D4_DR, LCD_D4_DB);

agieren zu können.

Nun ist hierzu allerdings 4 mal #define angegeben, wobei nur zwei
Informationen notwendig wären (es geht um Port C, es geht um Bit 2).
Als wollte ich dass elegant vereinfachen, indem ich

#define   LCD_D4_PORT  C
#define  LCD_D4_BIT  2

angebe, um mit weiteren Makros die eigentlichen LCD_D4_OUT/IN/DR/DB zu
erzeugen. In der Literatur habe ich den Infix-Operator gefunden:

#define  cat(x, y)  x##y

Zusammen mit der Definition

#define  LCD_D4_OUT  cat(PORT, LCD_D4_PORT)

erhalt ich die Fehlermeldung:

avr-gcc -g -Wall -O1 -mmcu=atmega8 -c display.c
display.c: In function `lcd_set_bits':
display.c:285: error: `PORTLCD_D4_PORT' undeclared (first use in this
function)
display.c:285: error: (Each undeclared identifier is reported only once

display.c:285: error: for each function it appears in.)
make: *** [display.o] Error 1
*** fehlgeschlagen ***

Die Anweisung
#define  LCD_D4_OUT  cat(PORT, C)
funktioniert hingegen.

Wie biege ich die Präprozessor-Anweisungen um, so dass nur zwei Angaben
(C, 2) notwendig sind?
Compiler: avr-gcc (GCC) 3.3 20030512 (prerelease)

Gruß
Marco

von leo9 (Gast)


Lesenswert?

ich mag zwar komplett daneben liegen, aber vielleicht hilft dir folgende
Idee: PIN und DDR haben ja einen konstanten "offset" zum PORT.

möglicherweise funktionierts so:
#define  LCD_D4_OUT PORTC
#define  LCD_D4_DB  PC2,
#define  LCD_D4_IN  LCD_D4_OUT - 2
#define  LCD_D4_DR  LCD_D4_OUT - 1

und bitte nicht hauen, c ist für mich eine Fremdsprache.

grüsse leo9

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.