Forum: Mikrocontroller und Digitale Elektronik C51 Macro Problem


von Berti (Gast)


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

von Peter D. (peda)


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.

von yalu (Gast)


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.

von Berti (Gast)


Lesenswert?

Danke, Ich konnte den Fehler beheben... hab da irgendwie um 17 Ecken 
gedacht...

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.