Fehler: expected expression before ')' token

OP #5395600
Lesenswert?

Hallo.
Habe hier 3 gleiche Fehlermeldungen "expected expression before ')' 
token"
Die bezieht sich zB. auf den Prog.code;
if(DEBOUNCE(PINA, PA7))  Sprungziel=1;

#define DEBOUNCE(port, pin) ...
// ist ein Macro, das 3 mal im Prog aufgerufen wird.
Die PIN´s sind alle korrekt deklariert.
OP #5396345
Lesenswert?

Das Macro besteht aus mehreren Zeilen mit "\" Zeilenverlängerung am Ende 
einer jeden Zeile. Hier steht am Ende eines jeden Befehls ein ";".

Nur bin ich mir nicht sicher, ob man Bemerkungen genau so wie in 
Funktionen mit "//" beginnen darf.

Bsp:
--folgendes ist eine Zeile!--

({ // (Quelle, Peter Dannegger, 
Beitrag "Entprellen für Anfänger") \

--oder Auszugsweise--

}  \
_delay_us(98);  // 256*98us =25ms \
OP #5396363
Lesenswert?

Der Code ist kopiert.
Beitrag "Entprellen für Anfänger"

Funktion finde ich in diesem Fall übersichtlicher, da aber der Autor 
Peter Dannegger (peda) folgendes dazu schrieb, und ich tatsächlich mit 
mehreren Tastern arbeite, folge ich seinem Rat;

Peter D. schrieb:
> Sie muß als Macro definiert sein, damit auch für jede Taste eine andere
> Flagvariable angelegt wird. Daher können mehrere Tasten unabhängig
> entprellt werden.
Moderator #5396392
Lesenswert?

__Son´s B. schrieb:
> Nur bin ich mir nicht sicher, ob man Bemerkungen genau so wie in
> Funktionen mit "//" beginnen darf.

Nein, das geht innerhalb mehrzeilig definierter Makros nicht.

Die Kommentarzeile müsste wie alle anderen Zeilen der Makrodefinition
mit einem \ enden, damit auch die folgenden Zeilen als zur Definition
zugehörig betrachtet werden. Damit gehören diese Zeilen aber auch zum
Kommentar, was natürlich nicht erwünscht ist.

Mit einen klassischen /*...*/-Kommentar gefolgt von einem \ besteht
dieses Problem nicht.
OP #5396408
Lesenswert?

Yalu X. schrieb:
> __Son´s B. schrieb:
>> Nur bin ich mir nicht sicher, ob man Bemerkungen genau so wie in
>> Funktionen mit "//" beginnen darf.
>
> Nein, das geht innerhalb mehrzeilig definierter Makros nicht.
>
> Die Kommentarzeile müsste wie alle anderen Zeilen der Makrodefinition
> mit einem \ enden, damit auch die folgenden Zeilen als zur Definition
> zugehörig betrachtet werden. Damit gehören diese Zeilen aber auch zum
> Kommentar, was natürlich nicht erwünscht ist.
>
> Mit einen klassischen /*...*/-Kommentar gefolgt von einem \ besteht
> dieses Problem nicht.

JA KLAR!!! VIELEN DANK @Yalu X, wäre ich nicht drauf gekommen...
OP #5396439
Lesenswert?

Dr. Sommer schrieb:
> Ach diese Angelegenheit, ja. Diese Konstruktion finde ich eh nicht so
> dolle, könnte man umbauen, ist dann ggf. etwas mehr Code.

Hmmmm?
Dannegger´s Lösung funktioniert - UND - ist zuverlässig!
Kann ja auch als Ausgangskonzept, Orientierung und Anregung her halten. 
Bedeutet aber auch, dass man das vermeindlich "Bessere" erst einmal 
beweisen muss.
"Maulhelden" gibt es in unserer Gesellschaft leider viel zu viel. Werden 
die dann noch laut, kann man(n) sogar führender Staatsdiener werden...
Gast #5396440
Lesenswert?

Ein paar Integer und eine Funktion lassen sich auch noch anders 
verpacken als in einem Makro. Der Algorithmus kann ja gleich bleiben, 
dann funktioniert das genau so gut. Habe eine ähnliche Variante auf 
Basis von Metaprogrammierung gebaut, die funktioniert auch gut.
#5396552
Lesenswert?

Yalu X. schrieb:
> Mit einen klassischen /*...*/-Kommentar gefolgt von einem \ besteht
> dieses Problem nicht.

Man kann auch das // Kommentar nach der "line-continuation" stellen:
1
#define FOO bar\  // comments could go here
2
  bara
Wenn man aber schon ein mehrzeiliges #define haben will, ist es am 
einfachsten auf Kommentare innerhalb vom #define zu verzichten
1
// Comments better go here
2
#define BAR bara
Gast #5396554
Lesenswert?

Yalu X. schrieb:
> Du meinst mit einem C++-Makro (auch Template genannt) ;-)

Da ist noch ein gewisser Unterschied...

Yalu X. schrieb:
> Aber wenn es auch mit einem C-Makro geht, warum nicht?

Weil das Makro einen versteckten Zustand hat (static Variable) den man 
nicht so offensichtlich sieht, und auf den man ausschließlich über das 
eine Makro zugreifen kann; möchte man aus mehreren Stellen das Ergebnis 
haben geht das nicht direkt. Und funktioniert das auch so mit mehreren 
Pins aus mehreren Ports?
Ist das Unterbringen eines ganzen Blocks in einer Expression überhaupt 
Standard C?
Gast #5396576
Lesenswert?

Dr. Sommer schrieb:
> Und funktioniert das auch so mit mehreren
> Pins aus mehreren Ports?

Achja, tut sie. Dafür belegt sie aber für jeden Pin 2 Variablen. Die 
Timer-Variante war es, welche nur einen Port konnte, dafür aber nur 3 
Bytes für 8 Pins brauchte. Mit templates lassen sich beide Vorteile 
vereinen...

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