Forum: Mikrocontroller und Digitale Elektronik Benötige Hilfe bei C


von Rene3233 (Gast)


Lesenswert?

Hallo ich bekommen immer diesen Fehler:
expected identifier or '(' before '{' token


Hier mein Code:
ISR ( TIMER0_OVF_vect ) // Timer0 overflow Interrupt
{                      <========= In Dieser zeile ist der Fehler
PORTD ^= (1 << PD1);
}

MFG
REne3233

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

include vergessen? - bitte vollständigen code.

von Rene3233 (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist er im anhang.
Mir ist aufgefallen wen ich das so schreibe:

ISR ( TIMER0_OVF_vect ){PORTD ^= (1 << PD1);}

Bekomme ich keinen Fehler es funktioniert aber auch nicht.

von Stefan E. (sternst)


Lesenswert?

Einer der Fälle wo sich einer selbst ins Bein schießt, weil er die 
Kommentare besonders "ästhetisch" haben möchte.

Die Zeile gehört mit zum Kommentar, weil du das Zeilenende "weg-escaped" 
hast.

Übrigens:
Was hat das Ganze in der Codesammlung zu suchen?

von W.S. (Gast)


Lesenswert?

Rene3233 schrieb:
> {                      <========= In Dieser zeile ist der Fehler

Nö.

Gewöhne dich daran, daß bei C-Compilern die Fehlermeldung in 99% aller 
Fälle nicht auf den eigentlichen Fehler hinweist, sondern selbiger sich 
ein paar Zeilen davor befindet.

Ich vermute mal, daß du bei der Formulierung der Interruptprozedur nen 
Fehler gemacht hast.

W.S.

von Rene3233 (Gast)


Lesenswert?

Danke es geht wieder das wuste ich nicht das man nach so welchen 
kommentaren immer eine zeile platz lassen muss.

Wo muss ich den so welche Threds sonst stellen?

von lablabla (Gast)


Lesenswert?


von HildeK (Gast)


Lesenswert?

Rene3233 schrieb:
> Danke es geht wieder das wuste ich nicht das man nach so welchen
> kommentaren immer eine zeile platz lassen muss.

Muss man nicht, wenn man die letzen beiden Zeichen in deinen Kommentaren 
weglässt. Denn in deinem Kommentar ist das vermeintliche 
Abschlusszeichen "\\" Quatsch!
"\" wird von jedem Compiler als Zeilenfortsetzung verstanden und damit 
gehört der ISR-Aufruf auch noch zum Kommentar. Jetzt steht die darauf 
folgende öffnende Klammer alleine rum.
Der Kommentar mit "//" hat nun mal kein definiertes Ende-Zeichen. Du 
könntest aber nochmals "//" verwenden, oder auch (fast) jedes andere mit 
Ausnahme von "\". Fast: die Kombination "/*" am Ende wäre natürlich auch 
falsch!
1
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
2
// Overflow Interrupt Time                              \\
3
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
4
//                                                      ^^ die gehören weg!
5
ISR ( TIMER0_OVF_vect ) // Timer0 overflow Interrupt
6
{
7
PORTD ^= (1 << PD1);
8
}

Wenn du unbedingt optische Rahmen benötigst, dann mach's doch so:
1
/*******************************************************/
2
/* Overflow Interrupt Time                             */
3
/*******************************************************/
4
ISR ( TIMER0_OVF_vect )       // Timer0 overflow Interrupt
5
...

von busche (Gast)


Lesenswert?

und ich dachte "//" ist nur zeilenbezogen ?! wie kann dann der interrupt 
da hinein geraten. man muss doch ein "//" nicht beenden, diese 
kommentarfunktion dient doch extra dazu NUR eine zeile zu 
kommentieren... hingegen "/* */" mehrere zeilen kommentieren kann

von Karl H. (kbuchegg)


Lesenswert?

busche schrieb:
> und ich dachte "//" ist nur zeilenbezogen ?!

Das Problem ist im eigentlichen Sinne nicht das // sondern das \ am 
Zeilenede.

Eine Zeile im Editor, die mit einem \ gefolgt von einem Zeilendezeichen 
(Carriage Return Linefeed) aufhört, wird vom Präprozessor als 
Zeilfortsetzungszeichen gewertet.

D.h. Du möchtest gerne aus irgendwelchen Gründen eine logische Zeile in 
mehrere physische Zeilen auftrennen, möchtest aber haben, das der 
COmpiler das als eine einzige Zeile ansieht.

Aus
1
   irgendwas \
2
   irgendwas_anderes

macht der Präprozessor
1
   irgendwas irgendwas_anderes

indem er den COntuniation Character auswertet und wie befohlen die 
Zeilen zusammengezogen hat.

Bei dir ist das eben
1
  //   irgendwas \
2
  irgendwas_anderes

was vom Präprozessor zu
1
  // irgendwas irgendwas_anderes
zusammengezogen wird.

Und damit findet sich das 'irgendwa_anderes' plötzlich im Kommentar 
wieder.

> wie kann dann der interrupt
> da hinein geraten.

Das passiert hauptsächlich dadurch, das der Programmierer kein C-Buch 
gelesen hat. Denn da würden solche Sachen (und noch viele mehr) nämlich 
drinn stehen. Unter anderem auch die Reihenfolge, in der der 
Präprozessor bestimmte Dinge auswertet und Codemodifikationen vornimmt

von Stefan E. (sternst)


Lesenswert?

busche schrieb:
> und ich dachte "//" ist nur zeilenbezogen ?!

Ist es auch. Aber das \ am Zeilenende setzt die syntaktische Zeile in 
der nächsten physischen Zeile fort.

von busche (Gast)


Lesenswert?

ok, mein fehler ... ich benutze eben "//" OHNE "\\" am ende, deswegen 
sind meine kommentare auch nur zeilenbezogen.
eure erläuterung war mir neu, wieder was dazu gelernt

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.