Forum: Compiler & IDEs Probleme mit Keil


von Tilo (Gast)


Lesenswert?

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?

von Peter (Gast)


Lesenswert?

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...

von A.K. (Gast)


Lesenswert?

> 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.

von Tilo (Gast)


Lesenswert?

@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?

von Tilo (Gast)


Lesenswert?

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) {
[...]

von A.K. (Gast)


Lesenswert?

> 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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Tilo (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.