Forum: Mikrocontroller und Digitale Elektronik "expected declaration or statement at end of input"


von Marcus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Normalerweise stelle ich nicht so blöde Fragen aber ich habe mir schon 
einige Threads durchgelesen, die dieses Thema behandlen, habe den Fehler 
aber nicht gefunden (oder ich bin blind). Deshalb wäre ich sehr dankbar, 
wenn ihr mir helfen könntet.

Fehlermeldungen und Warnungen:

F:\Maxi\Documents\Target\Digitaluhr\HMS-Uhr-V3.0\HMS-Uhr-V3.0\HMS-Uhr-V3 
.0.c(13,5):  'main' is normally a non-static function
F:\Maxi\Documents\Target\Digitaluhr\HMS-Uhr-V3.0\HMS-Uhr-V3.0\HMS-Uhr-V3 
.0.c(29,1):  expected declaration or statement at end of input

LG

von Stefan E. (sternst)


Lesenswert?

Der Fehler liegt wohl in einer der beiden Header-Dateien. Vermutlich 
eine fehlende schließende geschweifte Klammer.

von Marcus (Gast)


Lesenswert?

Danke! Habe bei einem Switch die Klammer vergessen. Warum schreit er 
aber dann in der C-Datei und nicht in der Header?

von Karl H. (kbuchegg)


Lesenswert?

Marcus schrieb:
> Danke! Habe bei einem Switch die Klammer vergessen. Warum schreit er
> aber dann in der C-Datei und nicht in der Header?

Weil sich der Fehler fortpflanzt.

Die Unterteilung, die du in Form von verschiednenen Dateien siehst, 
sieht der Compiler nicht mehr, weil der Präprozessor durch das #include 
schon alle Dateien in eine einzige Übersetzungseinheit zusammengeführt 
hat.

Und solange das was der Compiler zu Gesicht bekommt der Syntax 
entspricht, gibt es keinen Fehler. Dazu kommt eine Erweiterung des gcc, 
die es erlaubt innerhalb von Funktionen wieder neue Funktionen zu 
machen. Und so stapeln sich dann ab deiner vergessenen } alle danach 
folgenden Funktionen in die fehlerhafte Funktion hinein. Bis dann eben 
der COmpiler am Ende drauf kommt, dass da eine Funktion noch gar nicht 
beendet wurde.

von Marcus (Gast)


Lesenswert?

Achso, das heißt, dass er quasi die Headerdatei an Ort und Stelle 
"einfügt" und erst am Ende der C-Datei schreit, weil ihm eine Klammer 
fehlt. Oder?

von Karl H. (kbuchegg)


Lesenswert?

So wie eben der Präprozessor arbeitet.

Der arbeitet erst ein mal alle # Zeilen ab und erstellt daraus einen 
neuen Quelltext, den er dann an den eigentlichen Compiler weitergibt. 
Was das alles bedeutet, was zwischen den # Zeilen steht, interessiert 
den Präprozessor nicht. Der kümmert sich erst mal nur um alle # 
Anweisungen.

von switch (Gast)


Lesenswert?

Marcus schrieb:
> Habe bei einem Switch die Klammer vergessen. Warum schreit er
> aber dann in der C-Datei und nicht in der Header?

Warum schreibst du ein switch in den Header? Der Header dient als 
Interface und enthält Deklarationen, aber keinen Code.

von Rolf Magnus (Gast)


Lesenswert?

Marcus schrieb:
> Achso, das heißt, dass er quasi die Headerdatei an Ort und Stelle
> "einfügt" und erst am Ende der C-Datei schreit, weil ihm eine Klammer
> fehlt. Oder?

Wenn er in der Header-Datei einen Fehler erkennt, schreibt er das 
natürlich mit dazu. Aber in diesem Fall erkennt er im Header keinen 
Fehler. Erst wenn er ganz zum Schluß auf einmal merkt, daß da noch eine 
schließende Klammer fehlt, merkt er, daß was nicht stimmt und meldet 
deshalb erst dort den Fehler.

von Jörg G. (joergderxte)


Lesenswert?

Wenn du den Compiler (GCC?) dazu bringst Standard-C zu verarbeiten 
(Parameter '-std=c99'?), bekommst du die Fehlermeldung zumindest früher, 
weil in C keine Funktionen-in-Funktionen (nested Functions) erlaubt 
sind.

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.