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?
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
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.
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.
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?
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.
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.
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" :)
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.
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