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


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 Jens (Gast)


Angehängte Dateien:

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


Bewertung
0 lesenswert
nicht lesenswert
In welcher Funktion steht die for-Schleife?

von Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die steht in "menue.c".

von g457 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> diese for-Schleife wird vom gcc mit folgenden Fehlermelungen beworfen:

Und das zurecht.

HTH

von Nico W. (nico_w)


Bewertung
1 lesenswert
nicht lesenswert
Jens schrieb:
> Hallo,
> die steht in "menue.c".

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

von Jens (Gast)


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


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


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


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


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


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


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


Bewertung
0 lesenswert
nicht lesenswert
Random .. schrieb:
> empfehle ich, dich frühzeitig mit
> STL

Bei C?

von Random .. (thorstendb) Benutzerseite


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


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

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.