Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ???

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
09.10.2003, 15:09 Uhr
geissbock



hi!

mir ist kein treffendes thema zu meiner frage eingefallen.

C++:
static FILE *DBG;
#define TRACE(a)        if (DBG != NULL)
                                  { fprintf( DBG, "%4d: ", __LINE__);
                                    fprintf a ; fflush(DBG); }
...
static void panic(int orig_errno,
                       const char *msg,
                       const char *opt_msg)
{
     TRACE( (DBG, "panic: %s%s\n", msg, (opt_msg ? opt_msg : "")) );

     (void) fprintf(stderr, "%s: %s%s\n", OP_NAME,
                       msg, (opt_msg ? opt_msg : ""));
...
}



ab der geschweiften klammer hört es bei mir auf. besonders der klammerausdruck nach trace ist für mich verwirrend.

so wie ich es verstehe:
es wird ausgegeben "panic: (der inhalt von msg) und ???(was dann)
=> opt_msg ? opt_msg : "" sollte das gleiche sein wie
if(opt_msg)
msg;
else
""; => naja, ist bestimmt anders zu schreiben. oder geht das so einfach?

wozu ist das a hinter trace in der define?
wozu ist FILE nützlich?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.10.2003, 15:26 Uhr
typecast
aka loddab
(Operator)


Also die Defineanweisung bedeutet:

Wenn du ein TRACE() findest, dann setzte dafür einfach das ein, was hinter #define TRACE(a)
steht. Der Compiler ersetzt also

C++:
     TRACE( (DBG, "panic: %s%s\n", msg, (opt_msg ? opt_msg : "")) );


durch

C++:
if (DBG != NULL)
                                  { fprintf( DBG, "%4d: ", __LINE__);
                                    fprintf (DBG, "panic: %s%s\n", msg, (opt_msg ? opt_msg : ""));
                                     fflush(DBG); }



Beachte dabei einfach die dritte Zeile im if-Block
--
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
002
09.10.2003, 17:10 Uhr
ao

(Operator)


Das (A ? B : C) ist ein sog. "bedingter Ausdruck". A, B und C sind Ausdrücke. A ist die Bedingung und muss auf == 0 oder != 0 prüfbar sein. B und C sind die Rückgabewerte und müssen vom gleichen Typ sein (oder entsprechend der im Compiler eingebauten Regeln ineinander cast-bar sein).

Wie wirds verwendet? Einfaches Beispiel: Betragsfunktion


C++:
float Absolute (float x)
{
    return x > 0.0 ? x : -x;
}



Die Bedingung (A) ist (x > 0.0). Ist sie erfüllt (d.h. x positiv, der logische Ausdruck (x > 0.0) ist true, d.h. nicht 0), dann wird B, also x selbst zurückgegeben. Ist sie nicht erfüllt (d.h. x negativ, der logische Ausdruck (x > 0.0) ist false), dann wird C, also -x, also der entsprechende positive Wert, zurückgegeben.

In deinem Beispiel heißt das:

Wenn in opt_msg ein gültiger String übergeben wird, wird dieser ausgedruckt. Wenn in opt_msg ein NULL-Pointer übergeben wird, wird stattdessen "", also nichts, ausgedruckt

Klarer?

ao

Dieser Post wurde am 09.10.2003 um 17:12 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.10.2003, 17:29 Uhr
typecast
aka loddab
(Operator)


Hmm da hab ich doch glatt die Frage nicht richig durchgelesen...
--
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
004
10.10.2003, 11:36 Uhr
geissbock



thx.
aber @loddab:
hast sie dir doch durchgelesen. weil deine aussage hat mir beim verstehen von TRACE() sehr geholfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2003, 12:30 Uhr
geissbock



noch mal die frage: was macht FILE?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.10.2003, 14:54 Uhr
ao

(Operator)


FILE ist ein Datentyp, den die C-Runtime-Lib definiert. Meist handelt es sich um ein struct mit verschiedenen Einträgen, die die RT für die Verwaltung von geöffneten Dateien braucht (Bildschirm und Tastatur werden dabei auch als Textdateien angesehen).

FILE wird üblicherweise definiert in der stdio.h.

Öffnest du eine Datei mit fopen (der empfohlene ANSI-C-Weg), dann erhältst du als Rückgabewert einen Pointer auf eine von der Runtime-Lib angelegte FILE-Variable, den du in deinem Programm speichern und für alle folgenden Aufrufe von fread, fwrite, fprintf, fscanf, fseek, ftell und für den finalen fclose verwenden musst.

Versuche nicht, die in der FILE-Struktur gespeicherten Werte zu interpretieren oder gar zu verändern! Das ist allein Sache der Runtime-Lib. Betrachte den pointer nur als Handle, unter dem du das File erreichst.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.10.2003, 14:58 Uhr
geissbock



aha
 
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: