Forum: Compiler & IDEs warning: value computed is not used


von BikerGrisu (Gast)


Lesenswert?

Hallo,

nachdem ich nach laengerem Suchen nichts zu dem obigen Betreff gefunden 
habe,  moechte ich das denn doch mal posten.
Ich beschaeftige mich hobbymaeßig erst seit kurzem mmit dem ATmega8 und 
dem GCC. Deshalb sind mir die Fehlerausgaben auch noch nicht so 
gelaeufig.
Bei meinem Projekt wirft mir der Compiler momentan noch das im Betreff 
genannte Warning aus. Es fuehrt zwar zu keinem Abbruch und das Projekt 
wird gelinkt aber es stoert mich einfach, das der Compiler der Meinung 
ist, das da etwas noch nicht so ganz in Ordnung ist. Da wir in der Firma 
mit PC-Lint arbeiten und das Programm auch Recht hat, wenn es denn noch 
Fehler findet, wuerde es mich schon mal interessieren, was den Compiler 
zu diesem Warning veranlasst.
Das Warning wird z.B. bei folgender Programmzeile (in main.c) 
ausgegeben:

  SET_ALARM_LED(FALSE);

Wobei sich folgendes dahinter verbirgt (in glblvar.h in main.c):

#define TRUE   (1==1)
#define FALSE  !TRUE

#define ALARM_LED     ((1) << PIN6)
#define SET_ALARM_LED(x) ((x) ? (PORTD &= ~ALARM_LED) : (PORTD |= 
ALARM_LED))

Ich hoffe, das Thema ist nicht schon an andere Stelle behandelt worden 
und ich hab's einfach nicht gefunden.

Mfg, Frank

von Karl H. (kbuchegg)


Lesenswert?

BikerGrisu wrote:

> mit PC-Lint arbeiten und das Programm auch Recht hat, wenn es denn noch
> Fehler findet, wuerde es mich schon mal interessieren, was den Compiler
> zu diesem Warning veranlasst.

Die Warnung bezieht sich darauf, dass ein Wert errechnet wird,
der aber in weiterer Folge nicht verwendet wird. So was zb

int main()
{
  3 + 5;
}

Hier wird 3 + 5 berechnet, aber mit dem Ergebnis passiert nichts.

Konkret ist in deinem Beispiel der Ausdruck

    a ? b : c

enthalten, der wie so ziemlich alles in C ebenfalls ein Ergebnis
liefert. Das Ergebnis ist entweder b (wenn a wahr ist) oder
er ist c (wenn a falsch ist).

Damit kann man das zb so benutzen:

   Irgendwas = Bedingung ? Ausdruck1 : Ausdruck2;

An Irgendwas wird je nach Bedingung entweder Ausdruck1 oder
Ausdruck2 zugewiesen. Obiges ist also äquivalent zu

   if( Bedingung )
     Irgendwas = Ausdruck1;
   else
     Irgendwas = Ausdruck2;

hat aber den Vorteil, dass es an Stellen benutzt werden kann,
an denen ein if-then-else nicht möglich ist.

In Windows Code kommt zb bei einer Dialogsteuerung immer wieder
der Moment der Warheit an dem diverse Controls gezeigt oder
nicht gezeugt werden müssen, je nachdem in welchem Zustand der
komplette Dialog ist. Das liest sich zb. dann so:


    Index = m_ctlListBox.GetCurSel();

    m_ctlControl1.ShowWindow( Index == LB_ERR ? SW_HIDE : SW_SHOW );
    m_ctlControl2.ShowWindow( Index == LB_ERR ? SW_HIDE : SW_SHOW );
    m_ctlControl3.ShowWindow( Index == LB_ERR ? SW_HIDE : SW_SHOW );

an die jeweilge ShowWindow Funktion wird entweder SW_HIDE oder
SW_SHOW übergeben, je nachdem ob Index den Wert LB_ERR enthält
oder nicht.

>
>   SET_ALARM_LED(FALSE);
>
> Wobei sich folgendes dahinter verbirgt (in glblvar.h in main.c):
>
> #define TRUE   (1==1)
> #define FALSE  !TRUE
>
> #define ALARM_LED     ((1) << PIN6)
> #define SET_ALARM_LED(x) ((x) ? (PORTD &= ~ALARM_LED) : (PORTD |=
> ALARM_LED))

Hier mit diesem Ergebnis, dem neue Zustand von PORTD, wird nichts
gemacht.

von die ??? (Gast)


Lesenswert?

Abhilfe:

1
#define ON  (TRUE)
2
#define OFF (FALSE)
3
4
#define SET_ALARM_LED(x) ((x) ? (PORTD & ~ALARM_LED) : (PORTD | ALARM_LED))
5
6
// ...
7
8
PORTD = SET_ALARM_LED(ON);

Das sieht natürlich nicht mehr so elegant aus.

von die ??? (Gast)


Lesenswert?

Hoppla, bei TRUE wird sie ausgemacht, bei FALSE hingegen an. 
Schönheitsfehler.

von BikerGrisu (Gast)


Lesenswert?

Hallo,

erstmal Danke für die schnelle und ausführliche Antwort.

@ Karl heinz Buchegger:
Das der Ausdruck nicht weiterverarbeitet wird, so in der Art habe ich 
mir das schon gedacht. Habe aber dabei den ? Operator falsch 
interpretiert. Wenn das Ergebnis dieses Operators immer als Zuweisung 
für irgendetwas gedacht ist, dann ist klar, warum der Compiler bei mir 
dieses Warning ausgibt.

@ die ???:
Tja, so in der Richtung werde ich das ganze dann wohl abändern (Ich mag 
es halt einfach nicht, wenn Fehler bzw. Warnungen ausgegeben werden).

>Hoppla, bei TRUE wird sie ausgemacht, bei FALSE hingegen an.
>Schönheitsfehler.

Nee, das ist schon richtig so. Die LEDs sind alle Low aktiv. ;-)


PS: Ich muesste jetzt mal Sourcen für den KEIL Compiler auf diese 
Geschichte hin durchsehen. Ich wuerd' jetzt vermuten, das der sowas 
ignoriert. ;-(

Mfg, Frank

von Karl H. (kbuchegg)


Lesenswert?

BikerGrisu wrote:

> @ die ???:
> Tja, so in der Richtung werde ich das ganze dann wohl abändern (Ich mag
> es halt einfach nicht, wenn Fehler bzw. Warnungen ausgegeben werden).

Wenn dich das Ergebnis der Portzuweisung nicht interessiert, dann
kannst du auch das Makro umschreiben:
1
#define SET_ALARM_LED(x) { if (x) PORTD &= ~ALARM_LED; else PORTD |= ALARM_LED; }

von Peter D. (peda)


Lesenswert?

@BikerGrisu

Dein Code ist völlig korrektes C und produziert mit anderen Compilern 
auch keine Warnung.

Allerdings ist es ne Spezialität des GCC, etwas zu eifrig mit Warnungen 
zu sein.
Z.B. gibt es regelmäßig Warnungen bei zusammengesetzten Ausdrücken 
entsprechende den Vorrangregeln.
Da warnt er, daß er noch zusätzliche Klammern sehen möchte.


Peter

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.