Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Komisches Verhalten bei If Abfragung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.04.2004, 15:36 Uhr
Pablo
Supertux
(Operator)


Es gibt etwas wa sich nicht verstehen kann, warum das passiert.

Ich habe eine globale Variable FILE* output;

Da der Benutzer bestimmen kann, ob output stdout, stderr oder eine Datei sein soll, habe ich output als global deklariert, damit sie in allen .c Dateien verfügbar ist.

Nun, ich wollte "# ----- end of debug informtion ------\n" am Ende der Datei schreiben, falls output weder stdout noch stderr, also eine Datei.

Da output auch NULL sein kann, habe ich folgendes gemacht:

C++:
if (output!=stdout && output!=stderr) {
    dfprintf(output, "# --- end of debug informtion ----\n"); // eigene Funktion
    if (output!=NULL)
        fclose(output);
}



So funktioniert es wunderbar. Aber wenn ich

C++:
if (!output)
        fclose(output);

statt

C++:
if (output!=NULL)
        fclose(output);

schreibe, dann bekomme ich Segmentation Fault wieso denn das?
ich dachte !output wäre äquivalent zu output != NULL, oder? Wieso wird fclose ausgeführt, wenn ich if (!output) schreibe? An anderen Stellen geht das, nur da nicht, wieso denn das?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.04.2004, 20:45 Uhr
Hans
Library Walker
(Operator)


Hallo Pablo,

das dürfte damit zusammen hängen, das NULL nicht unbedingt gleich einer binären Null ist.
Sieh Dir mal an, wie NULL in den includefiles definiert ist.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.04.2004, 21:00 Uhr
Pablo
Supertux
(Operator)


Das komische ist, dass es mit char* so immer funktioniert, oder das glaube ich zumindest
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.04.2004, 21:59 Uhr
ao

(Operator)


Wenn output NULL ist, dann (vermute ich) darfst du dfprintf nicht drauf anwenden.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.04.2004, 22:06 Uhr
Pablo
Supertux
(Operator)


Ich habe dfprintf so gemacht, dass wenn output NULL benutzt wird, die Funktion nichts macht. Wenn fprintf NULL bekommt, dann gibt es Segmentation Fault. Desahlb habe habe dfprintf geschrieben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 12.04.2004 um 22:06 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.04.2004, 09:01 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo postete

C++:
if (!output)
        fclose(output);

statt

C++:
if (output!=NULL)
        fclose(output);

schreibe, dann bekomme ich Segmentation Fault wieso denn das?
ich dachte !output wäre äquivalent zu output != NULL, oder?

Nein:
(!output) ist (in diesem Context) identisch mit (!(output!=NULL)) und das widerrum mit (output==NULL)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.04.2004, 09:28 Uhr
(un)wissender
Niveauwart


Wo er recht hat, hat er recht.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.04.2004, 09:38 Uhr
Pablo
Supertux
(Operator)


Und wieso denn das?

Das heißt, wenn ich sowas hab

C++:
void foo(const char* bufer) {
    if (!buffer) return;
    ...
}



Dann ist die If-Abfragung identisch mit if (buffer==NULL) oder das nur mit FILE*?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.04.2004, 09:52 Uhr
typecast
aka loddab
(Operator)


Ja !buffer ist das gleiche wie buffer == NULL. Das liegt daran:

Ist buffer == NULL, dann wird if (buffer) mit false ausgewertet (da NULL == 0).
Das heißt, das in dem Programm if(0) {blabla} ausgeführt wird.

Hast du jetzt if (!buffer) stehen, dann wird (im Fall das buffer == NULL) im Programm ein:
if (!0) {blabla} ausgeführt und !0 ist true.

Ich hoffe die Erklärung hilft dir weiter.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.04.2004, 10:18 Uhr
Pablo
Supertux
(Operator)


O Shittttttttt stimmt, wie blöd von mir. Wow, Denkfehler von mir, hab zu schnell gedacht, ihr habt Recht, das ist mir peinlich.

Da ich gewohnt bin die pointers auf NULL zu verifizieren, habe ich das aus Gewohnheit gemacht, ohne daran zu denken.

Danke, ich habe schon meinen dummen Fehler gesehen, bin ich blind!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 13.04.2004 um 10:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: