C51 Macro Problem

Gast #818290
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich hab ein kleines Problem mit dem C51 Compiler und Macros.
Ich möchte folgende Zeilen zu Macros machen:
1
ADDR = A;
2
DATA = D;
wird zu
1
#define WRITE(A;D) ADDR = A; DATA = D;

bei diesem Teil bekomm ich ein Problem...
1
ADDR = A;
2
D = DATA;
wie "übersetze ich das?"
1
#define (D)READ(A) ADDR = A; D = DATA;

Ich bekomm da eine Fehlermeldung und auch die Hilfe hat mich nicht 
weitergebracht.
Weis jemand wie ich das am Besten schreibe?

Danke schon mal im Voraus
#818629
Lesenswert?
• ▲
▼
Berti wrote:
> Ich bekomm da eine Fehlermeldung

Wenn Du diese im Original posten würdest und dazu das File im Anhang, 
damit man die Zeilennummer zuordnen kann, dann:

1. bekommst Du schneller Hilfe.

2. lernst Fehlermeldungen selber zu deuten.


Peter

P.S.:
Es liegt am ; da muß ein , hin.
Gast #818678
Lesenswert?
• ▲
▼
> #define (D)READ(A) ADDR = A; D = DATA;

Soll das D ein Argument von READ sein? Das geht so nicht. Argumente
stehen (wie auch bei Funktionen) immer nach dem Makronamen in
Klammern. Also so
1
#define READ(D,A) ADDR = A; D = DATA;

oder so
1
#define READ(A,D) ADDR = A; D = DATA;

Außerdem birgen die zwei Anweisungen in der Makrodefinition einen
Fallstrick. Verwendest du es in folgendem Kontext
1
if(u>5)
2
  READ(data, 0x1234);

wird die zweite Anweisung des Makros immer ausgeführt, unabhängig
vom Ergebnis des if-Ausdrucks.

Etwas besser wird es, wenn die Anweisungen geklammert werden:
1
#define READ(D,A) { ADDR = A; D = DATA; }

Damit ist obiges Problem beseitigt, aber
1
if(u>5)
2
  READ(data, 0x1234);
3
else
4
  ...

ergibt einen Syntaxfehler, weil zwischen dem '}' und dem 'else' ein
';' steht. Workaround: Das Semikolon weglassen, das sieht dann aber
nicht mehr C-like aus.

Dieses Problem wird behoben, wenn man das Makro folgendermaßen
definiert:
1
#define READ(D,A) do { ADDR = A; D = DATA; } while(0)

Jetzt sieht zwar das Makro hässlich aus, dafür darf beim Aufruf des
Makros immer ein Semikolon dahinter stehen (auch vor einem 'else' wie
in obigem Beispiel). Das hässliche Makro schaut man, wenn es einmal
funktioniert, sowieso nicht mehr an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren