mikrocontroller.net

Forum: Compiler & IDEs Probleme mit Keil


Autor: Tilo (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Tilo (Gast)
Datum:

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

Autor: Tilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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) {
[...]

Autor: A.K. (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Tilo (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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