www.mikrocontroller.net

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


Autor: BikerGrisu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abhilfe:

#define ON  (TRUE)
#define OFF (FALSE)

#define SET_ALARM_LED(x) ((x) ? (PORTD & ~ALARM_LED) : (PORTD | ALARM_LED))

// ...

PORTD = SET_ALARM_LED(ON);

Das sieht natürlich nicht mehr so elegant aus.

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, bei TRUE wird sie ausgemacht, bei FALSE hingegen an. 
Schönheitsfehler.

Autor: BikerGrisu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define SET_ALARM_LED(x) { if (x) PORTD &= ~ALARM_LED; else PORTD |= ALARM_LED; }

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.