C51 Macro Problem

Gast #818290
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
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
> #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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.