mikrocontroller.net

Forum: Compiler & IDEs TRUE und FALSE im avr-gcc


Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

wie muß ich eine Funktion definieren, so dass ich sie im Hauptprogramm 
wie folgt abfragen kann? Ich habe das so probiert:
uint8_t wichtige_test_funktion(void)
{
  if (alles == ok)
   return 0;
  else
   return 1;
}

Und dann im Hauptprogramm:
if (!wichtige_test_funktion())
  usart_puts("Ganz großes Problem!\n\r");

Leider ist aber immer alles in Ordnung, ich komme nie zur Fehlermeldung, 
auch wenn ich sie provoziere?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard schrieb:
> Hallo Leute,
>
> wie muß ich eine Funktion definieren, so dass ich sie im Hauptprogramm
> wie folgt abfragen kann? Ich habe das so probiert:
> uint8_t wichtige_test_funktion(void)
> {
>   if (alles == ok)
>    return 0;
>   else
>    return 1;
> }

Warum gibst du 0 zurück, wenn alles Ok war? Und warum verwendest du 
nicht gleich bool?

> Und dann im Hauptprogramm:
> if (!wichtige_test_funktion())
>   usart_puts("Ganz großes Problem!\n\r");

Hier gibst du eine Fehlermeldung aus, wenn 0 zurückgegeben worden ist, 
also wenn alles ok war.

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst wenn dann 255 (0b11111111) zurück geben
ein 1 (0b00000001) negiert wird zu 254 (0b11111110)

Gruß
Roland

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

Bewertung
0 lesenswert
nicht lesenswert
Roland Praml schrieb:
> du musst wenn dann 255 (0b11111111) zurück geben
> ein 1 (0b00000001) negiert wird zu 254 (0b11111110)

Das passt schon so.
er verwendet ja richtigerweise die logische Negation ! und nicht die 
binäre Negation ~

Er kann 255 zurückgeben, aber normalerweise ist es nicht notwendig.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, daß du hier nicht exakt den Originalquelltext zeigst?

Ich halte es für möglich, daß dort steht: if (alles = ok)...
statt if (alles == ok)...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, wie in C99 beschrieben:
#include <stdbool.h>

bool wichtige_test_funktion(void)
{
  if (alles == ok)
   return false;
  else
   return true;
}

Es sind am Ende Aliase für 0 und 1.  Obwohl jeder Wert verschieden
von 0 als "wahr" interpretiert wird, liefern die Vergleichsoperatoren
in C ausschließlich diese beiden Werte.  Daher lässt sich dein
Beispiel auch wie folgt verkürzen:
bool wichtige_test_funktion(void)
{
  return !(alles == ok);
}
bzw.
bool wichtige_test_funktion(void)
{
  return alles != ok;
}

(womit auch offensichtlich wird, dass du irgendwie die Logik
vertauscht hast)

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Richard schrieb:
>> Hallo Leute,
>>
>> wie muß ich eine Funktion definieren, so dass ich sie im Hauptprogramm
>> wie folgt abfragen kann? Ich habe das so probiert:
>> uint8_t wichtige_test_funktion(void)
>> {
>>   if (alles == ok)
>>    return 0;
>>   else
>>    return 1;
>> }
>
> Warum gibst du 0 zurück, wenn alles Ok war? Und warum verwendest du
> nicht gleich bool?

Es hat sich fast überall so eingebürgert dass wenn eine Funktion "0" 
zurückliefert, sie ohne Fehler durchgelaufen ist (für gewisse 
Schnittstellen/Funktionen ist es auch durch ANSI definiert, dass es so 
sein muss). Fehler werden meist mit Negativen Zahlen zurückgegeben. Bei 
manchen Funktionen macht es aber auch keinen Sinn z.B. bei file_exists.
ist z.B. bei strcmp genauso. Wenn der String gleich ist wird 0 
zurückgegeben. Wenn man also wissen will ob der String gleich war, 
schreibt man:
if(!strcmp(a,b))
  printf("String ist gleich");
else
  printf("String ist ungleich");
Auch bei der Verkettung von Prozessen in der Konsole mit && arbeiten 
nach dem Prinzip. Wenn die Main-Funktion eines Prozesses !0 zurückgibt 
ist ein Fehler aufgetreten.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. schrieb:
> Es hat sich fast überall so eingebürgert dass wenn eine Funktion "0"
> zurückliefert, sie ohne Fehler durchgelaufen ist.

Dann sollte man aber für den Rückkehrtyp auf keinen Fall "bool"
benutzen, denn dann würde die Funktion "false" zurückgeben, wenn
es in Ordnung war.  Die entsprechende Auswertung (als Boolescher
Wert/Ausdruck benutzt) würde sich völlig widersinnig lesen, und
sowas:
if (testfunction_returns_bool() != false) ...

ist kompletter Schwachsinn.  Wenn testfunction_returns_bool() einen
Wert vom Typ "bool" liefert, dann kann man diesen in der if-Anweisung
direkt testen, der zusätzliche Vergleich gegen true oder false bringt
rein gar nichts mehr, denn der Vergleichsoperator liefert per
definitionem auch nur einen Typ "int" mit den möglichen Werten 0 oder
1.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Timmo H. schrieb:
>> Es hat sich fast überall so eingebürgert dass wenn eine Funktion "0"
>> zurückliefert, sie ohne Fehler durchgelaufen ist.
>
> Dann sollte man aber für den Rückkehrtyp auf keinen Fall "bool"
> benutzen, denn dann würde die Funktion "false" zurückgeben, wenn
> es in Ordnung war.
Der TO hat auch kein Bool benutzt, das war Jörg

"The C Standard (ISO/IEC 9899:1999 (``ISO C99'')) defines the values 0, 
EXIT_SUCCESS, and EXIT_FAILURE as possible values of status."

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. schrieb:

> Es hat sich fast überall so eingebürgert dass wenn eine Funktion "0"
> zurückliefert, sie ohne Fehler durchgelaufen ist

Jedenfalls soweit Unix Pate stand. In Windows APIs findet sich ein 
kunterbunter Mix aus beiden Philosophien.

Autor: rogie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler kann man auch zurückgeben, wenn die Funktion FALSE liefert und 
man dann eine extra Funktion aufruft, z.b. GetLastError(), um den Fehler 
zu ermitteln, wird z.B. in der WINAPI sehr oft gemacht.

Im Prinzip also Geschmackssache, ich sehe das so:

Kann eine Funktion einen Fehlercode zurückgeben, so sollte 0 bedeuten: 
Kein Fehler, z.B. sowas wie
Errorcode = OpenDevice(); 

Kann sie nur mitteilen, ob eine Bedingung erfüllt ist, sollte sie True 
bzw. false zurückliefern, z.B.
 if (IsByteReceived()) .... 

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Timmo H. schrieb:
>> Es hat sich fast überall so eingebürgert dass wenn eine Funktion "0"
>> zurückliefert, sie ohne Fehler durchgelaufen ist.
>
> Dann sollte man aber für den Rückkehrtyp auf keinen Fall "bool"
> benutzen, denn dann würde die Funktion "false" zurückgeben, wenn
> es in Ordnung war.

Ich würde in so einem Fall nicht von bool abraten, sondern eher
einen sinnvollen Namen empfehlen.

Bei einem Ausdruck wie:
     if( teste_irgendwas() ) ...
ist eine Fehlinterpretation vorprogrammiert, weil "testen"
nichts zum Ergebnis sagt.
"true" und "false" sind ja erstmal neutral; die Zuordnung
zu "gut" oder "schlecht" ist willkürlich.

Schreibt man dagegen in den Namen rein, was das Ergebnis
bedeutet, wird es klar und keiner interpretiert es falsch:
     if( irgendwas_in_Ordnung() ) ...
     if( irgendwas_geprueft_und_fuer_gut_befunden() ) ...
     if( fehler_bei_irgendwas() ) ...
     if( irgendwas_gescheitert() ) ...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. schrieb:
> Der TO hat auch kein Bool benutzt, das war Jörg

Ja, aber er hat letztlich nach bool gefragt (klein geschrieben übrigens,
zumindest nach C99).

> "The C Standard (ISO/IEC 9899:1999 (``ISO C99'')) defines the values 0,
> EXIT_SUCCESS, and EXIT_FAILURE as possible values of status."

Das ist aber ausschließlich auf den Rückkehrstatus von main() in
die Umgebung vorgesehen.  Daher beginnen die Namen ja auch mit
EXIT_.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon klar.
Bei allen anderen hat man freie Hand.
Ich mach es aber gerade auch bei anderen Funktionen so, sofern es 
sinnvoll ist. Erleichtert teilweise auch die Überprüfung

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.