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


von stm32 Keil uVision var declared but not referenzed (Gast)


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

von Bernhard B. (schluchti)


Lesenswert?

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
}

von Klaus W. (mfgkw)


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.

von stm32 Keil uVision var declared but not referenzed (Gast)


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

von Tim T. (tim_taylor) Benutzerseite


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

von Klaus W. (mfgkw)


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

von Klaus W. (mfgkw)


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/

von Klaus W. (mfgkw)


Lesenswert?

Und das Handbuch zu deinem Compiler natürlich

von Klaus W. (mfgkw)


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/

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.