Hallo Ich habe ein kleines ARM-Projekt mit WinARM (gcc) geschrieben. Leider funktioniert mein Code nicht so wie er soll und ich muss debuggen. Ich habe einen passenden U-Link Adapter für den von mir verwendeten aduc7020. WinARM kann afaik kein Zeilenweise Debugging. Daher wollte ich mir Keil anschaun, da hier der U-Link Support drin ist. Leider fliegt mit mein C-Code um die Ohren: [...] const int TEST[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; char erg; char zero=1; for (int i=9; i>-1; i--) { [...] C\LIB.C(23): error C25: syntax error near 'const' C\LIB.C(27): error C25: syntax error near 'for' C\LIB.C(27): error C25: syntax error near 'int' C\LIB.C(27): error C25: syntax error near '>' C\LIB.C(27): error C25: syntax error near '--' Woran kann das liegen? Gruß, Tilo PS: Wo sind im Forum Fragen zu nicht gcc-Kompilern am besten aufgehoben?
Da scheint der Parser des Compilers komplett aus dem Tritt gekommen zu sein, der Fehler liegt mit grosser Wahrscheinlichkeit in den Pünktchen [...] bzw. Zeilen gleich oberhalb Deines Codes. zB eine vergessene Klammer oder Strichpunkt, oder ein Fehler in einem #incude-File oberhalb dieser Zeilen...
> WinARM kann afaik kein Zeilenweise Debugging WinARM alleine nicht so ganz, immerhin muss irgendwas die Verbindung zum ARM herstellen. Aber ist die mal hergestellt, kann GDB das natürlich sehr wohl. Üblicherweise via Insight oder Eclipse bedient.
@A.K: Danke für den Tip mit Eclipse. Ich werde mir das mal anschaun. GDB kann mit uLink umgehn? Das wäre super. @Peter: Du hast Recht, der Kompiler kommt durcheinander. Hier ist nochmal der Code der ersten Funktion in der Datei: char IntToStr(char *String, int val) { char *origString = String; /* if (val==0) { *String=0x30; String++; *String=0; return *origString; } if (val<0) { *String='-'; String++; val = val * -1; } */ const int TEST[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; char erg; char zero=1; for (int i=9; i>-1; i--) { if (val!=0) { [...] Wenn die beiden IF-Bedingunen auskommentiert sind, läuft der Kompiler bis zur for-Schleife durch. Dort beschwert er sich: C\LIB.C(26): error C25: syntax error near 'int' Entferne ich die Komentare um die if-Schleifen, steigt der Kompiler bei const int TEST... aus: C\LIB.C(23): error C25: syntax error near 'const' Ich habe den Eindruck, als müsste ich alle Variablen am Anfang einer Funktion definieren, erst dann darf Programmcode folgen. Ich habe versucht, den gcc unter Keil zu verwenden. Mit gcc hatte ich anfangs Probleme, weil ich den C-Standard mit -std=gnu99 angeben musste. Ist es hier ähnlich?
Ich bin ein Stück weiter: int main (void) { Init(); [76] char select=0; [77] while (select!='0') { // Endlosschleife fr Hauptprogramm [78] select = MainMenu(); switch (select) { [...] Fehler: C\MAIN.C(76): error C25: syntax error near 'char' C\MAIN.C(77): error C25: syntax error near 'while' C\MAIN.C(77): error C25: syntax error near '!=' C\MAIN.C(78): error C53: redefinition of 'select' Dei Zeilennummern im Code sind imOriginal natürlich nicht drin. Verschiebe ich die Variablendefinition an den Anfang der Funktion, läuf der Kompiler durch: int main (void) { char select=0; Init(); while (select!='0') { // Endlosschleife fr Hauptprogramm select = MainMenu(); switch (select) { [...]
> Init(); > char select=0; C99 verwöhnt? Vor C99 ging das nicht, da mussten Variablen am Anfang vom Block stehen, nach der ersten zeile Code war's aus.
Tilo wrote: > Ich habe den Eindruck, als müsste ich alle Variablen am Anfang einer > Funktion definieren, erst dann darf Programmcode folgen. Genau so ist es. > Ich habe versucht, den gcc unter Keil zu verwenden. Mit gcc hatte > ich anfangs Probleme, weil ich den C-Standard mit -std=gnu99 angeben > musste. Ist es hier ähnlich? Ja, die Möglichkeit, Variablen an beliebigen Stellen im Code zu definieren, hat erst der C99-Standard von C++ übernommen. GCC hatte das auch im gnu89-Modus (C89 + GCC-Erweiterungen, das ist es, was GCC derzeit nimmt, wenn kein -std= angegeben ist) schon drin, mit der Ausnahme jedoch, dass die Deklaration einer Variablen am Anfang einer for-Schleife dort abgelehnt worden ist.
Danke für eure Antworten. Das erklärt einiges. Ich dachte es war schon immer möglich, an beliebigen Stellen im Code Variablen zu definieren. Nun ja, C ist auch um einiges älter als ich. Laut www.keil.com verwender uVision C90 :( Danke für eure Hilfe
Tilo wrote:
> Laut www.keil.com verwender uVision C90 :(
Ich glaube, im embedded-Bereich findest du C99 derzeit nur bei GCC und
IAR vor. Im Host-Bereich könnte es ein wenig mehr Verbreitung haben,
wenngleich ich irgendwo gelesen habe, dass Winzigweich es komplett
ignoriert hat bislang.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.