Varieble referenzed but not never declared

Gast #1819123
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
1
..
2
 s16 test=1;
3
..

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

3
..\..\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
#1819124
Du musst deine Variablen am Beginn der Funktion deklarieren.

z.B:
1
void test(){ 
2
   uint16_t variable = 0; //funktioniert
3
   test2(); //rufe die Funktion test2 auf
4
}
1
void test(){
2
   test2(); //rufe die Funktion test2 auf
3
   uint16_t variable = 0; //funktioniert nicht
4
}
#1819126
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.
Gast #1819132
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
#1819155
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.