printf verwenden zum Loggen - ja oder nein?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

printf verwenden zum Loggen - ja oder nein?

Beitrag von +Fuss+ » Mi Feb 04, 2009 4:43 pm

Hallo,
Ich programmiere ja zur Zeit an einem "Anwender-Programm" (hat also relativ wenig mit Konsole/Terminal zutun).
Jetzt habe ich in dem Code allerdings einige printf's drin, es wird jede Sekunde der aktuelle Timerstand ausgegeben etc.

Mal so allgemein:
Lässt man solche Sachen in dem Code und wenn wer das Programm aus dem Terminal startet, sieht er halt alles was der Programmierer auch sieht, oder nimmt man die Printf's raus, so dass es keinen Unterschied macht, ob das Programm per Doppelklick gestartet wird oder aus dem Terminal?

Ist ja eigentlich nicht wichtig, aber das würde mich mal interessieren, wie das bei einem professionellen Programm gemacht wird.

MfG Fuss

edit by Xin: Betreff präzisiert

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: printf - ja oder nein?

Beitrag von cloidnerux » Mi Feb 04, 2009 4:54 pm

Ist das denn ein Konsolen Programm?
Wenn ja, wird ales was du mit printf ausgibts auch zu sehen sein.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: printf - ja oder nein?

Beitrag von Kerli » Mi Feb 04, 2009 5:06 pm

Also üblicherweise unterscheidet man schon zumindest zwischen zwei Versionen nämlich Debug- und Releaseversion. Dabei würde ich bei der Releaseversion Ausgaben die jede Sekunde erfolgen auf jeden Fall weglassen. Das würde sonst vor allem bei einer langen Laufzeit sehr schnell zu sehr viel Text führen der bei manchen Kompilern sogar in eine Datei geschrieben wird (zb MinGW).

Wichtige Informationen oder Statusmeldungen kann man natürlich drinnen lassen um auch dem Anwender eine Möglichkeit zu geben dich vor allem im Fehlerfall mit Informationen zu versorgen können.

Mit einem Debugsymbol im Präprozessor sollte das aber kein Problem sein:

Code: Alles auswählen

#ifdef DEBUG
printf("Some usefull infos.\n");
#endif
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: printf - ja oder nein?

Beitrag von Jside » Mi Feb 04, 2009 5:14 pm

Also printf's in der Console sind auch gut, zum z.b. Debuggen, falls das Programm crasht, kann man sehen, was es gemacht hat, bevor es gecrasht ist.
"Profi" Programme, so wie z.b. der Firefox Browser zeigen nur Warnungen auf der Console an. Wie du das machts, ist egal, das musst du auf die Leute, die es benutztenwollen zuschneiden.

P.s.1 : Der Doppelklick wurde übrigends von M$ patentiert.
P.s.2 : Ich hab gerade das Buch "The Connection Machine" von Danial Hillis bekommen, und das war vorher aus der Library des Palo Alto Research Lab's:
"CASH HILO687", "Property of Palo Alto Research Schlumberger Computer Aided Systems Library" ..geil nicht^^?

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: printf - ja oder nein?

Beitrag von +Fuss+ » Mi Feb 04, 2009 5:31 pm

Mhh
dann nehme ich in der fertigen Version die printf's raus.

Wieder was gelernt.

MfG Fuss

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: printf - ja oder nein?

Beitrag von Xin » Do Feb 05, 2009 9:07 am

+Fuss+ hat geschrieben:Hallo,
Ich programmiere ja zur Zeit an einem "Anwender-Programm" (hat also relativ wenig mit Konsole/Terminal zutun).
Jetzt habe ich in dem Code allerdings einige printf's drin, es wird jede Sekunde der aktuelle Timerstand ausgegeben etc.

Mal so allgemein:
Lässt man solche Sachen in dem Code und wenn wer das Programm aus dem Terminal startet, sieht er halt alles was der Programmierer auch sieht, oder nimmt man die Printf's raus, so dass es keinen Unterschied macht, ob das Programm per Doppelklick gestartet wird oder aus dem Terminal?
Im einfachsten Fall definiert man eine Debug-Funktion, die die Ausgaben verwaltet. In der Release-Version klammerst Du mit einem #ifndef DEBUG den Inhalt aus. So bestimmst Du per Compiler-Switch ob es Ausgaben gibt.
+Fuss+ hat geschrieben:Ist ja eigentlich nicht wichtig, aber das würde mich mal interessieren, wie das bei einem professionellen Programm gemacht wird.
Bei einem Anwenderprogramm sperrt man die Ausgaben meist im Release, so dass sie nicht mehr ausgegeben werden.

printf verwendet man fast nie, aber fprintf zum Beispiel: printf( ... ist eine Abkürzung für fprintf( stdout, ...
Mit fprintf schreibt man dann nach stderr, das erscheint bei Windows aber genauso in der Konsole.
Nun kann man aber stderr (=Console) schließen und für stderr eine Datei öffnen und so schreibt man in eine Debug-Datei. Ist die Datei /dev/null, so werden die Ausgaben verworfen und nirgendwo geschrieben.

Ich verwende in meinen Programmen eine Log-Klasse, welche in meinem Compiler die Fehlermeldungen in der Konsole optisch aufbereitet präsentiert, sie optional in eine Datei schreibt, aber bei GUI Programmen auch über GTK ein Fenster öffnen kann und eine Fehlerliste mitführen kann, die man per Buttons wieder löschen, speichern oder kopieren, bzw. die Fehler nach Priorität filtern kann.

Das absolut teuerste Programm, an dem ich je mitgewirkt habe, hatte ebenfalls eine eigene Log-Klasse. Diese müllte einfach alles in die Konsole, weil sie absolut alles mitloggte: User hat anfrage gestellt, 5000 Schritte mit Teilergebnissen der Zwischenschritte bis das Ergebnis berechnet ist und am Schluss das Ergebnis. Die Release-Version war eine mit wenigen Tests getestete Trunk-Version. Eine Unterscheidung zwischen Debug und Release ist mir ansonsten nie aufgefallen.
Das Programm läuft allerdings auf Servern, d.h. der Server wird vollgemüllt, aber der Rechner des Kunden sieht das so ja nicht.
Das zweitteuerste Programm (etwa 1/100 des Preises zuvor, wobei ich immernoch vermute, dass wenn wir im Forum alle unser monatliches Einkommen zusammenwerfen, wird's noch nicht für 'ne Lizenz reichen), an dem ich je mitgearbeitet habe, läuft auf dem Benutzerrechner. Es macht einfach überhaupt keine Log-Ausgaben... bestenfalls ein 'Das Programm musste beendet werden.' ;-)

Was also "professionell" ist, liegt im Auge des Betrachters.
Es ist meist eher die Frage, ob sich der Kunde dran stört, bzw. was die Entwickler brauchen, um das Programm erfolgreich zu entwickeln. Passt beides nicht zusammen, baut man halt einen Switch ein.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten