mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C51 Macro Problem


Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

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

bei diesem Teil bekomm ich ein Problem...
ADDR = A;
D = DATA;
wie "übersetze ich das?"
#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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#define READ(D,A) ADDR = A; D = DATA;

oder so
#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
if(u>5)
  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:
#define READ(D,A) { ADDR = A; D = DATA; }

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

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:
#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.

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Ich konnte den Fehler beheben... hab da irgendwie um 17 Ecken 
gedacht...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.