Forum: Compiler & IDEs variable wird wegoptimiert


von Klaus H. (Firma: privat) (klaus777)


Lesenswert?

Hallo zusammen,
ich such schon die ganze Zeit, mein Atmelstudio haut mir immer wieder 
die String-Variablen weg

Einfaches Beispiel:

void test(void)
{
  char zeit[5]="   ";
  zeit[2]=',';
  return;
}

Warning    variable 'zeit' set but not used [-Wunused-but-set-variable]

Nach all dem..
https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C
Ich versteh das nicht, was macht die Schicht 8 falsch?

Auch getestet:
volatile
__attribute__((unused));


Grüße Klaus

von mh (Gast)


Lesenswert?

Klaus H. schrieb:
> ich such schon die ganze Zeit, mein Atmelstudio haut mir immer wieder
> die String-Variablen weg
> Einfaches Beispiel:
> void test(void)
> {
>   char zeit[5]="   ";
>   zeit[2]=',';
>   return;
> }
> Warning    variable 'zeit' set but not used [-Wunused-but-set-variable]
Wir wärs, wenn du die Variable einfach benutzt? Der Compiler verhält 
sich korrekt.

von Falk B. (falk)


Lesenswert?

Klaus H. schrieb:
> Hallo zusammen,
> ich such schon die ganze Zeit, mein Atmelstudio haut mir immer wieder
> die String-Variablen weg

Nö, das macht der compiler. Weil die Variable niemals gelesen, sprich, 
benutzt wird. Und WOM (write only memory) ist uncool.

> Warning    variable 'zeit' set but not used [-Wunused-but-set-variable]

Steht doch hier.

> Auch getestet:
> volatile
> __attribute__((unused));

Schmarn.

von try this (Gast)


Lesenswert?

Klaus H. schrieb:
> Ich versteh das nicht, was macht die Schicht 8 falsch?

Evtl. ungeeignete Einstellung für die Compiler-Optimierung gewählt?

von Jens (Gast)


Lesenswert?

Zeit wird weg optimiert wäre klasse 🤣

Du erstellst die Variable in deiner Funktion
Beschreibst diese
Und springst wieder raus.

Die Funktion macht nichts und könnte ebenfalls weg optimiert werden.

Oder du verheimlichst einiges aus der Funktion

von Sebastian R. (sebastian_r569)


Lesenswert?

Klaus H. schrieb:
> Ich versteh das nicht, was macht die Schicht 8 falsch?

Die angelegte Variable nicht nutzen. Und der Compiler merkt das und 
optimiert sie weg.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Klaus H. schrieb:
> Ich versteh das nicht, was macht die Schicht 8 falsch?

Sie versteht die völlig zurecht ausgegebene Fehlermeldung nicht:-)
Du schreibst zwar Werte in deine Variabel Zeit, aber wärend deren 
Gültigkeitsbereich machst du danach nichts mehr sinnvolles damit.

So nebenbei, das "return" ist hier überflüssig, des denötigst du nur 
wenn du auch was zurückgeben willst.

von Klaus H. (Firma: privat) (klaus777)


Lesenswert?

Hallo zusammen
Danke!
wie ich schon sagte Schicht 8

Ich hatte mir zur Fehlersuche eine Funktion geschrieben und den Teil wo 
die Variable kopiert wird nicht übernommen.
Danke für eure Unterstützung !

Der Wald und viele Bäume...

von Hanswurst (Gast)


Lesenswert?

Hallo,
wenn man SPI verwendet, dann muss man ja den Eingangspuffer lesen, um 
das Interupt Flag BF  (Buffer full) zu löschen.
Wenn der enthaltene Wert kann aber nicht benötigt werden, weil es Dummy 
ist.
Ich glaube einfaches lesen der Hardwareregisters auf eine Variable wird 
dann auch wegoptimiert.....
Sollte man die Variable als volatile deklarieren ?

Was ist der richtige Weg, um den Puffer wieder frei zu kriegen.

von Falk B. (falk)


Lesenswert?

Hanswurst schrieb:
> Ich glaube einfaches lesen der Hardwareregisters auf eine Variable wird
> dann auch wegoptimiert.....

Nö.

> Sollte man die Variable als volatile deklarieren ?

Nö, denn das Register ist volatile. Es reicht ein
1
SPDR;

Hier MUSS der Compiler SPDR lesen, auch wenn er das Ergebnis 
wegschmeißt.

von Hanswurst (Gast)


Lesenswert?

Ah. So einfach.  Danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Es reicht ein
>
1
SPDR;

Und wenn man das für den Leser noch klarer ausdrücken will, dass der 
gelesene Wert verworfen werden soll, dann schreibt man
1
(void)SPDR;

von Falk B. (falk)


Lesenswert?

Jörg W. schrieb:
> Und wenn man das für den Leser noch klarer ausdrücken will, dass der
> gelesene Wert verworfen werden soll, dann schreibt man
> (void)SPDR;

Das ist so oder so kyptische C-Syntax, da reißt ein (void) auch nix mehr 
;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Das ist so oder so kyptische C-Syntax, da reißt ein (void) auch nix mehr

Für mich schon. ;-)  Mir ist dann sofort klar, dass es Absicht war, den 
Wert wegzuwerfen. Ich glaube, einige statische Code-Checker kann man 
damit auch überzeugen. :)

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.