Forum: Compiler & IDEs Geany, C, GCC4.7, eigenes makefile: Will for-Schleife nicht kompilieren!


von Jens (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

diese for-Schleife wird vom gcc mit folgenden Fehlermelungen beworfen:

gcc -Wall -c "menue.c" (im Verzeichnis: 
/home/ranger/Projekte/Mal_sehn_obs_geht)
menue.c:9:1: error: expected identifier or ‘(’ before ‘for’
 for(i=0;i<8;i++)
 ^~~
menue.c:9:10: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ 
before ‘<’ token
 for(i=0;i<8;i++)
          ^
menue.c:9:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ 
before ‘++’ token
 for(i=0;i<8;i++)
              ^~
menue.c:7:13: warning: ‘menueposts’ defined but not used 
[-Wunused-variable]
 static char menueposts[8][7] = 
{"Clock:","Temp1:","Temp2:","BoVol:","Date :","Hoo  :","mi/ma:","Res. 
"};
             ^~~~~~~~~~
Kompilierung fehlgeschlagen.

Wenn ich die Schleife Auskommentiere geht alles wie es soll.
Benutzt werden die Geany-IDE, GCC4.7 und ein eigenes Makefile(siehe 
Anhang).

Was ist da los?

von Dirk B. (dirkb2)


Lesenswert?

In welcher Funktion steht die for-Schleife?

von Jens (Gast)


Lesenswert?

Hallo,
die steht in "menue.c".

von g457 (Gast)


Lesenswert?

> diese for-Schleife wird vom gcc mit folgenden Fehlermelungen beworfen:

Und das zurecht.

HTH

von Nico W. (nico_w)


Lesenswert?

Jens schrieb:
> Hallo,
> die steht in "menue.c".

Die falsche Antwort ;-)
Sie steht in keiner Funktion. Aber sie sollte.

von Jens (Gast)


Lesenswert?

Hey,
als ich .c geschrieben habe ist es mir aufgefallen:

Ohne eine Funktion wird wohl die Schleife nie erreicht/ausgeführt.

Danke für diesen kurzen, knackigen aber zielführenden Hinweis.

Wiso nur kann man das den Fehlermeldungen nicht entnehmen?

Jens

von mh (Gast)


Lesenswert?

Jens schrieb:
> Wiso nur kann man das den Fehlermeldungen nicht entnehmen?

Die Fehlermeldungen des Compilers sind nicht dazu gedacht, das Lernen 
der Sprache zu ersetzen. Die Meldung erfüllt in diesem Fall ihren Zweck 
zu 100%. Sie zeigt dem Programmierer auf die Zeile genau, wo er einen 
Fehler gemacht hat.

von Rolf M. (rmagnus)


Lesenswert?

Jens schrieb:
> Hey,
> als ich .c geschrieben habe ist es mir aufgefallen:
>
> Ohne eine Funktion wird wohl die Schleife nie erreicht/ausgeführt.

So kann man es auch formulieren. In C muss die Schleife in einer 
Funktion stehen, sonst ist das ein Fehler. Sie wird dadurch tatsächlich 
in gewissem Sinne nie erreicht bzw. ausgeführt, weil der Compiler mit 
Fehler abbricht und daher schlicht keinen ausführbaren Code erzeugt.

> Wiso nur kann man das den Fehlermeldungen nicht entnehmen?

Weil es für einen Menschen zwar einfach aussieht, aber tatsächlich einen 
ziemlichen Aufwand bedeutet, dem Compiler sowas beizubringen. Der schaut 
auf ganz andere Weise über den Code als ein Mensch.

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Ganz nebenbei: in den letzten 7 Jahren sind die Fehlermeldungen des gcc 
deutlich besser geworden. Der gcc-4.9 ist von 2014, aktuell ist 10.2, 
selbst bei Debian gibt es schon die Version 9.2. Was spricht gegen ein 
gelegentliches Update?

von Dirk B. (dirkb2)


Lesenswert?

Rolf M. schrieb:
> In C muss die Schleife in einer
> Funktion stehen, sonst ist das ein Fehler.

Außerhalb von Funktionen sind in C nur Deklarationen, Definitionen und 
Initialisierungen erlaubt.

Jedenfals kein "auszuführender" Code.

von Dirk B. (dirkb2)


Lesenswert?

Jens schrieb:
> Wiso nur kann man das den Fehlermeldungen nicht entnehmen?

Weil der Compiler das for gar nicht sieht, weil er es da nicht erwartet.

Und die Fehlermeldung dass etwas Anderes erwartet wurde, hast du 
bekommen.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Vor C mit BASIC gearbeitet? :-)
Mach deine "menueposts" ruhig "const" (bei AVR: "progmem").

Wenn du nur auf dem PC unterwegs bist, empfehle ich, dich frühzeitig mit 
STL und viel "const" und vor allem "const ref" auseinanderzusetzen. 
Vereinfacht vieles, ohne "const (ref)" wirds bei großen Datenmengen 
allerdings langsam (wg. copy).

Bei Mikrocontrollern, z.B. ARM, hat "const" den Vorteil, dass diese 
Daten im Flash und nicht im RAM landen. Bei AVR braucht man dafür 
"progmem".
Weiterhin kann der Compiler dadurch einige Optimierungen vornehmen. Ggf. 
in Verbindung mit "static" (Begrenzung auf das aktuelle Modul).

Ansonsten:
MS Viusual Studio schmeisst immerhin nen Syntax Error
Clang ist ähnlich "verwirrend" :)

von Dirk B. (dirkb2)


Lesenswert?

Random .. schrieb:
> empfehle ich, dich frühzeitig mit
> STL

Bei C?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Dirk B. schrieb:
> Random .. schrieb:
>> empfehle ich, dich frühzeitig mit
>> STL
>
> Bei C?

C++ :-)
Lohnt auf dem PC aber immer, auch bei hochperformanten Sachen.

Zur Zeit spiele ich mit C++ auf einem STM32F4 mit C++ herum. STDIO 
retarget mit C++ low level Treibern, eigenem VFS, CMSIS-RTOS Kapselung 
mit C++ (also Thread ist geerbter Member einer Klasse). Sehr sauber, 
interessant, nur Debuggen ist (noch) etwas painful, da keine STL 
Unterstützung.

: Bearbeitet durch User
von Jens (Gast)


Lesenswert?

Hallo,
Dank für die zahlreichen Erklärungen.
Bin eigentlich auf AVR unterwegs und wollte jetzt nur mal etwas 
entwerfen, eine Menüführung für ein Projekt mit Atmega und Display eben.
Hier im Garten habe ich keinen AVR dabei, da übe ich einfach mit dem 
Laptop.
Das mir so ein Fehler unterläuft ist mir natürlich peinlich, immerhin 
befasse ich mich seit 10 Jahren hobbymäßig mit C. Dachte es liegt 
villeicht am makefile.

Jens

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.