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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von __Son´s B. (bersison)


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


Bewertung
0 lesenswert
nicht lesenswert
Für was steht das "..."?

Wahrscheinlich steht da ein unvollständiger Ausdruck.

: Bearbeitet durch Moderator
von Tom (Gast)


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

von Gäste (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vermutung: im Makro ist ein Strichpunkt ; enthalten

von mr. mo (Gast)


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


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


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

von __Son´s B. (bersison)


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


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

von __Son´s B. (bersison)


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


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


Bewertung
0 lesenswert
nicht lesenswert
die if ist garantiert nicht kopiert

von Yalu X. (yalu) (Moderator)


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


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


Bewertung
-2 lesenswert
nicht 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)


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


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


Bewertung
0 lesenswert
nicht 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:
#define FOO bar\  // comments could go here
  bara
Wenn man aber schon ein mehrzeiliges #define haben will, ist es am 
einfachsten auf Kommentare innerhalb vom #define zu verzichten
// Comments better go here
#define BAR bara

von Dr. Sommer (Gast)


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


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


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

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.