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.
Für was steht das "..."? Wahrscheinlich steht da ein unvollständiger Ausdruck.
:
Bearbeitet durch Moderator
Was macht der Preprozessor aus den Zeilen mit dem Makro (gcc -E)?
Vermutung: im Makro ist ein Strichpunkt ; enthalten
Gäste schrieb: > Vermutung: im Makro ist ein Strichpunkt ; enthalten Jo! Mir auch schon mehrfach passiert, ergibt genau die Fehlermeldung.
__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)
Gäste schrieb: > Vermutung: im Makro ist ein Strichpunkt ; enthalten Kann sein, schaue ich mir morgen mal an.
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
Und warum muss das ein Makro sein? Eine Funktion mit mehreren Befehlen wäre doch viel einfacher.
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
Ach diese Angelegenheit, ja. Diese Konstruktion finde ich eh nicht so dolle, könnte man umbauen, ist dann ggf. etwas mehr Code.
__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.
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...
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...
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.
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?
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
|
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?
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.