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
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.
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.
Hoppla, bei TRUE wird sie ausgemacht, bei FALSE hingegen an. Schönheitsfehler.
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
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; }
|
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.