PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable in loop() - Denkblockade? Compiler-Bug?



cdk
20.07.2019, 08:48
Hallo Leute,

habe eine Variable in loop() definiert und bekomme dafür eine Compiler-Warnung. So sieht der auf's Problem reduzierte Code aus:

void loop() {
int button;
unsigned long browse;
// browse = 0;

button = GetButton();
if (button) { // Taster gedrückt?
switch (button) {

case KUP:
browse = millis() + 8001;
// Vorblättern
break;

case KDOWN:
browse = millis() + 8000;
// Zurückblättern
break;
}
}
}

Die resultierende Warnung:

C:\Eigene Dateien\Arduino\Eventlogger\Eventlogger.ino: In function 'void loop()':

C:\Eigene Dateien\Arduino\Eventlogger\Eventlogger.ino:7:16: warning: variable 'browse' set but not used [-Wunused-but-set-variable]

unsigned long browse;

^


WIESO? Das mag ja nicht funktionsrelevant sein, aber ich will schon gerne einen Code ohne Warnungen produzieren!

'browse' soll für einen Timeout (8s) verwendet werden, nach dessen Ablauf die Anzeige wieder auf Standardtext zurückgeschaltet wird. Eigentlich soll dieser Timeout für beide case-Bedingungen gleich sein (8000) - daß ich oben stattdessen 8001 verwende ist auch nur ein vergeblicher Versuch diese Warnung zu vermeiden. Ebenso wie die wieder auskommentierte Zeile 'browse = 0;' ...

Wenn ich die Variable 'browse' global deklariere geht's, aber da gehört sie nunmal nicht hin. Zudem würde ich gerne verstehen was sich der Compiler dabei denkt wenn er sowas behauptet :mrgreen:

Gruß, Dieter

HaWe
20.07.2019, 09:33
Hallo Leute,

habe eine Variable in loop() definiert und bekomme dafür eine Compiler-Warnung. So sieht der auf's Problem reduzierte Code aus:

void loop() {
int button;
unsigned long browse;
// browse = 0;

button = GetButton();
if (button) { // Taster gedrückt?
switch (button) {

case KUP:
browse = millis() + 8001;
// Vorblättern
break;

case KDOWN:
browse = millis() + 8000;
// Zurückblättern
break;
}
}
}

Die resultierende Warnung:


WIESO? Das mag ja nicht funktionsrelevant sein, aber ich will schon gerne einen Code ohne Warnungen produzieren!

'browse' soll für einen Timeout (8s) verwendet werden, nach dessen Ablauf die Anzeige wieder auf Standardtext zurückgeschaltet wird. Eigentlich soll dieser Timeout für beide case-Bedingungen gleich sein (8000) - daß ich oben stattdessen 8001 verwende ist auch nur ein vergeblicher Versuch diese Warnung zu vermeiden. Ebenso wie die wieder auskommentierte Zeile 'browse = 0;' ...

Wenn ich die Variable 'browse' global deklariere geht's, aber da gehört sie nunmal nicht hin. Zudem würde ich gerne verstehen was sich der Compiler dabei denkt wenn er sowas behauptet :mrgreen:

Gruß, Dieter

hallo,
browse werden zwar Werte zugewiesen, aber nichts damit weiter gemacht, daher löscht der Compiler diese Zeilen beim Optimieren heraus, und dann ist browse letztendlich komplett ungenutzt.
Willst du vermeiden, dass die Zeilen herausoptimiert werden, deklariere browse als volatile,
und wenn du darüberhinaus sicherstellen willst, dass der Inhalt auch in der nächsten loop Schleife noch vorhanden ist, zusätzlich als static:

volatile unsigned long browse;
volatile static unsigned long browse;

cdk
20.07.2019, 10:04
Achso. Ich dachte wenn ich unterschiedliche Werte zuweise "mache" ich schon was damit. Dann wird sich die Warnung wohl im weiteren Code-Fortschritt wieder erledigen wenn "richtig" damit gearbeitet wird.
Danke für die schnelle Antwort!

Edit:

Dann wird sich die Warnung wohl im weiteren Code-Fortschritt wieder erledigen wenn "richtig" damit gearbeitet wird. Ja - und so war's dann auch... :)