Probleme mit Keil

Gast #496784
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?
Gast #496839
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...
Gast #496940
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.
Gast #497069
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?
Gast #497078
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) {
[...]
Moderator Persönliche Seite #497103
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.
Gast #497117
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren