Forum: Mikrocontroller und Digitale Elektronik Fehler: expected expression before ')' token


von __Son´s B. (bersison)


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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Für was steht das "..."?

Wahrscheinlich steht da ein unvollständiger Ausdruck.

: Bearbeitet durch Moderator
von Tom (Gast)


Lesenswert?

Was macht der Preprozessor aus den Zeilen mit dem Makro (gcc -E)?

von Gäste (Gast)


Lesenswert?

Vermutung: im Makro ist ein Strichpunkt ; enthalten

von mr. mo (Gast)


Lesenswert?

Gäste schrieb:
> Vermutung: im Makro ist ein Strichpunkt ; enthalten

Jo! Mir auch schon mehrfach passiert, ergibt genau die Fehlermeldung.

von Auf Passer (Gast)


Lesenswert?

__Son´s B. schrieb:
> Die PIN´s sind alle korrekt deklariert.

Aber deine Rechtschreibung nicht.

Du verwendest den Deppenapostroph. Das merkt der Compiler.
--> https://www.deppenapostroph.info)

von __Son´s B. (bersison)


Lesenswert?

Gäste schrieb:
> Vermutung: im Makro ist ein Strichpunkt ; enthalten
Kann sein, schaue ich mir morgen mal an.

von __Son´s B. (bersison)


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 \

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Und warum muss das ein Makro sein? Eine Funktion mit mehreren Befehlen 
wäre doch viel einfacher.

von __Son´s B. (bersison)


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.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

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

von Gäste (Gast)


Lesenswert?

die if ist garantiert nicht kopiert

von Yalu X. (yalu) (Moderator)


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.

von __Son´s B. (bersison)


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

von __Son´s B. (bersison)


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

von Dr. Sommer (Gast)


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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Dr. Sommer schrieb:
> Ein paar Integer und eine Funktion lassen sich auch noch anders
> verpacken als in einem Makro.

Du meinst mit einem C++-Makro (auch Template genannt) ;-)

Aber wenn es auch mit einem C-Makro geht, warum nicht?

von Eric B. (beric)


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

von Dr. Sommer (Gast)


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?

von Dr. Sommer (Gast)


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

von __Son´s B. (bersison)


Lesenswert?

Eric B. schrieb:
> Yalu X. schrieb:
>> Mit einen klassischen /*...*/-Kommentar gefolgt von einem \ besteht
>> dieses Problem nicht.
>
> Man kann auch das // Kommentar nach der "line-continuation"
> stellen:#define FOO bar\  // comments could go here
>   bara

Hatte ich ursprünglich versucht - habe dadurch Massenfehlermeldungen 
zurück bekommen.

: Bearbeitet durch User
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.