mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Varieble referenzed but not never declared


Autor: stm32 Keil uVision var declared but not referenzed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie der Titel vermuten lässt benutze ich die Keil uvision IDE für einen 
ARM cortexm3 STM32.

Beim Versuch das STM32 USART printf beispiel zu modifiezeren stoße ich 
auf folgendes Problem:

Sobald ich eine variable declariere
..
 s16 test=1;
..

gibt mir der Compiler folgende Fehlermeldung aus:
..\..\examples\USART\Printf\main.c(89): error:  #268: declaration may not appear after executable statement in block

..\..\examples\USART\Printf\main.c(89): warning:  #177-D: variable "test" was declared but never referenced

Im geposteten Beispiel habe ich nur die variable s16 eingefügt und sonst 
alles auf standart gelassen.

habt ihr eine Idee warum das passiert?

mfg
timo

Autor: Bernhard B. (schluchti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst deine Variablen am Beginn der Funktion deklarieren.

z.B:
void test(){ 
   uint16_t variable = 0; //funktioniert
   test2(); //rufe die Funktion test2 auf
}
void test(){
   test2(); //rufe die Funktion test2 auf
   uint16_t variable = 0; //funktioniert nicht
}

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. in C müssen in jedem Block erst die Deklarationen und
   Definitionen kommen, dann die ausführbaren Anweisungen.
   Deine s16 scheint nach einer ausführbaren Anweisung zu kommen.
2. Etwas mehr Quelltext erspart das Rätselraten.
3. Texte, die nicht in jedem Satz mehrere Fehler enthalten
   sind leichter lesbar.

Autor: stm32 Keil uVision var declared but not referenzed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen dank für die schnelle Hilfe.

kannst du mir ein stichwort geben damit ich weitere informationen 
googeln kann, oder mir erklären warum das nicht funktioniert ?

(bei programmen für Linux hatte ich damit noch keine probleme)



mfg
tom

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> 1. in C müssen in jedem Block erst die Deklarationen und
>    Definitionen kommen, dann die ausführbaren Anweisungen.

Diese Aussage gilt nur bis C99...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim T. schrieb:
> Diese Aussage gilt nur bis C99...

genau genommen "bis vor C99"; in C99 ist es schon frei.

Offenbar hat er aber nicht C99...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stm32 Keil uVision var declared but not referenzed schrieb im Beitrag 
#1819132:
> kannst du mir ein stichwort geben...

C-Standard, ISO-C99, ISO-C89
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und das Handbuch zu deinem Compiler natürlich

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stm32 Keil uVision var declared but not referenzed schrieb im Beitrag 
#1819132:
> (bei programmen für Linux hatte ich damit noch keine probleme)

Das liegt daran, daß du da vermutlich den gcc genommen hattest.
Der kennt zum einen etliche verschiedene C-Standards (je nach
Compileroptionen), und zum anderen sieht er selbst bei einem
eingestellten älteren Standard recht großzügig über viele
eigentlich nicht zulässige Dinge hinweg.

Beispiel: Mit der Option -std=c89 akzeptiert er sowohl
Quelltext nach ISO-C89, als auch etliche Erweiterungen.
Dein Beispiel, in dem erst ausführbare Anweisungen kommen und
dann nochmal Deklarationen/Definitionen, wäre nach C89 eigentlich
falsch, der gcc sagt aber nichts dazu und schluckt es.
Mit -std=c89 -pedantic akzeptiert er ebenfalls C89, meckert aber
alles an, was über C89 hinausgeht. Dein Programm wäre damit
also falsch.
Mit -std=c99 ist es in jedem Fall wieder richtig, egal ob mit
oder ohne -pedantic.

Wieder: http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/

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.