 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
MARS_3-142 Guest
|
Posted: Mon Mar 27, 2006 10:06 pm Post subject: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
Hi Ihr,
ich versuche gerade ein kleines Projekt zu schreiben und stoße dabei
schon am Anfang auf bannig Probleme. Wollte mir eine Debugmöglichkeit
(mit Logdatei) schaffen. Dabei wollte ich eine Funktion nutzen, die
eine vorher undefinierte Anzahl von Parameter erlauben kann - also
sowas wie z.B. printf(). Kann mir jemand einen Tip geben, wie ich sowas
implementieren könnte?
MfG
Peter Siegmund
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Mon Mar 27, 2006 11:06 pm Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
"MARS_3-142" <peter.siegmund (AT) gmail (DOT) com> writes:
| Quote: | ich versuche gerade ein kleines Projekt zu schreiben und stoße dabei
schon am Anfang auf bannig Probleme.
|
bannig??
| Quote: | Wollte mir eine Debugmöglichkeit (mit Logdatei) schaffen. Dabei
wollte ich eine Funktion nutzen, die eine vorher undefinierte Anzahl
von Parameter erlauben kann - also sowas wie z.B. printf(). Kann mir
jemand einen Tip geben, wie ich sowas implementieren könnte?
|
Am besten gar nicht. Was spricht gegen die Verwendung von Streams?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Tue Mar 28, 2006 9:06 pm Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
Thomas Maeder wrote:
| Quote: | "MARS_3-142" <peter.siegmund (AT) gmail (DOT) com> writes:
ich versuche gerade ein kleines Projekt zu schreiben und stoße dabei
schon am Anfang auf bannig Probleme.
bannig??
|
<http://www1.ndr.de/ndr_pages_std/0,2570,OID1521504_REF_SPC1049804,00.html>
<http://minilien.com/?JVVAHyvYWn>
| Quote: | Wollte mir eine Debugmöglichkeit (mit Logdatei) schaffen. Dabei
wollte ich eine Funktion nutzen, die eine vorher undefinierte Anzahl
von Parameter erlauben kann - also sowas wie z.B. printf(). Kann mir
jemand einen Tip geben, wie ich sowas implementieren könnte?
Am besten gar nicht. Was spricht gegen die Verwendung von Streams?
|
In etwa so hier:
std::ofstream logfile("LogFile.txt", std::ios::ate);
#define LOG(msg) (logfile << msg << std::endl)
Benutzt wird es so:
LOG("x = " << x << ", y = " << y);
Lässt sich natürlich noch beliebig ausbauen (z.B. Fehlerüberprüfung,
oder Ausgabe von Zeitstempel, __FILE__ und __LINE__ in jeder Zeile).
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Lars T. Droegemueller Guest
|
Posted: Tue Mar 28, 2006 11:06 pm Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
| Quote: | ich versuche gerade ein kleines Projekt zu schreiben und stoße dabei> schon am Anfang auf bannig Probleme. Wollte mir eine Debugmöglichkeit
(mit Logdatei) schaffen. Dabei wollte ich eine Funktion nutzen, die
eine vorher undefinierte Anzahl von Parameter erlauben kann - also
sowas wie z.B. printf(). Kann mir jemand einen Tip geben, wie ich sowas
implementieren könnte?
|
Hi,
du brauchst den header stdarg.h, die Makros va_start(), va_arg() und
va_end() sowie den Datentyp va_list. Dann brauchst du noch einen besonderen
Ausdruck für Parameterlisten, ich glaube er heißt Ellipse. Sieht so aus:
"...". Vielleicht hilft dir ja dieser Beispielcode von mir (Auch wenn du
jetzt schon mühelos alles googlen könntest):
#include <iostream>
#include <stdarg.h>
using namespace std;
int sum(int parameterCnt, ...)
{
va_list ap;
va_start(ap, parameterCnt);
int result = 0;
for (int loop = 1; loop <= parameterCnt; loop++)
{
result += va_arg(ap, int);
};
va_end(ap);
return result;
};
int main(int argc, char *argv[])
{
cout<<sum(9, 9, 8, 4, 5, 7, 1, 3, 3, 2)<<endl; //Ausgabe: 42
system("PAUSE");
return 0;
};
Naja, ich denke mal das Beispiel spricht für sich. Viel Spaß damit.
Das Problem ist, dass du nicht abfragen kannst, wie viele Parameter
übergeben wurden. Du brauchst IMMER einen Parameter der angibt wo schluss
ist, denn wenn du zu viele Parameter mit va_arg() einliest, dann bekommst
du nur Müll zurück. Geschickt ist es auch als letzten Parameter immer
irgendeinen Nullwert zu übergeben, also bei Zeigern NULL und sonst
irgendeinen Wert den ein korrekter Parameter nie haben kann.
Ausserdem weiß ich nicht, wie es hier um die Typensicherheit bestellt ist.
In C geht das jedenfalls natürlich genauso, denk dir einfach die Art der
Ausgabe anders.
mfg Lars
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Mar 29, 2006 7:06 am Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
Falk Tannhäuser <tannhauser86549spam (AT) free (DOT) fr> writes:
Der untere URL liefert eine eigenartige Zwischenseite und lädt dann
ewig. Der obere lädt von Anfang an ewig.
| Quote: | Wollte mir eine Debugmöglichkeit (mit Logdatei) schaffen. Dabei
wollte ich eine Funktion nutzen, die eine vorher undefinierte Anzahl
von Parameter erlauben kann - also sowas wie z.B. printf(). Kann mir
jemand einen Tip geben, wie ich sowas implementieren könnte?
Am besten gar nicht. Was spricht gegen die Verwendung von Streams?
In etwa so hier:
std::ofstream logfile("LogFile.txt", std::ios::ate);
#define LOG(msg) (logfile << msg << std::endl)
|
Naja, Makros mag ich auch nicht so sehr.
Wie wärs stattdessen mit einer Funktion LOG, welche als Rückgabewert
ein (temporäres) Objekt liefert,
* in das (dank eines operator<<-Templates) alles schreiben kann
* dessen Destruktor das Zeilenende schreibt
?
Und ein Warmduscher bin ich auch, zumindest wenn's ums Programmieren
geht - ich würde mindestens
#define LOG(msg) (logfile << (msg) << std::endl)
schreiben.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Mar 29, 2006 10:06 am Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
Falk Tannhäuser wrote:
| Quote: | In etwa so hier:
std::ofstream logfile("LogFile.txt", std::ios::ate);
#define LOG(msg) (logfile << msg << std::endl)
Benutzt wird es so:
LOG("x = " << x << ", y = " << y);
|
Ich würde eher den streambuf in std::clog durch einen ersetzen, der das tut,
was ich will. Das Makro scheint mir recht nutzlos.
| Quote: | Lässt sich natürlich noch beliebig ausbauen (z.B. Fehlerüberprüfung,
oder Ausgabe von Zeitstempel, __FILE__ und __LINE__ in jeder Zeile).
|
Dafür wäre ein Makro noch sinnvoll.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Wed Mar 29, 2006 12:06 pm Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
Thomas Maeder wrote:
| Quote: | Falk Tannhäuser <tannhauser86549spam (AT) free (DOT) fr> writes:
|
[...]
| Quote: | Wollte mir eine Debugmöglichkeit (mit Logdatei) schaffen. Dabei
wollte ich eine Funktion nutzen, die eine vorher undefinierte Anzahl
von Parameter erlauben kann - also sowas wie z.B. printf(). Kann mir
jemand einen Tip geben, wie ich sowas implementieren könnte?
Am besten gar nicht. Was spricht gegen die Verwendung von Streams?
In etwa so hier:
std::ofstream logfile("LogFile.txt", std::ios::ate);
#define LOG(msg) (logfile << msg << std::endl)
Naja, Makros mag ich auch nicht so sehr.
|
In diesem Fall haben sie aber bedeutlichen Vorteile. Zum Ersten:
man kann diesen Makro umdefiniriert, damit der Logging gar nicht
da ist. In der Tat habe ich das nie benötigt; man kann auch das
Überprüfung eines Flags ausreichend schnell machen, dass der
Code selber in der gelieferten Version bleibt. Aber als Argument
(oder Gegenargument) hat es mir mehrmals geholfen, Logging
akzeptiert zu bekommen.
Zweitens, naturlich, ist, dass nur durch einen Makro kann man
automatisch __LINE__ und __FILE__ einfügen. Ich benutze also
einen Makro, auch wenn ich eine Syntax benutze, die das
Ausschalten bei der Kompilierung nicht erlaubt.
| Quote: | Wie wärs stattdessen mit einer Funktion LOG, welche als
Rückgabewert ein (temporäres) Objekt liefert,
* in das (dank eines operator<<-Templates) alles schreiben kann
* dessen Destruktor das Zeilenende schreibt
?
|
Das benutze ich am meistens. So etwas:
LOG( gravity ) << "message" << data << "more message" ;
Das temporäre Objekt handelt die Bedingung (ist Logging für
diese Gravity aktiv), und in seinem Destruktor (am Ende des
Ausdrucks) einem Flush macht und den Lock freilässt.
LOG ist aber immerhin ein Makro, der sich auf etwas so wie
folgendes expandiert:
localLogger.getStream( gravity, __FILE__, __LINE__ )
| Quote: | Und ein Warmduscher bin ich auch, zumindest wenn's ums
Programmieren geht - ich würde mindestens
#define LOG(msg) (logfile << (msg) << std::endl)
schreiben.
|
Dann funktionniert es nicht mehr.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Wed Mar 29, 2006 3:06 pm Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
Hallo,
MARS_3-142 schrieb:
| Quote: | ich versuche gerade ein kleines Projekt zu schreiben und stoße dabei
schon am Anfang auf bannig Probleme. Wollte mir eine Debugmöglichkeit
(mit Logdatei) schaffen. Dabei wollte ich eine Funktion nutzen, die
eine vorher undefinierte Anzahl von Parameter erlauben kann - also
sowas wie z.B. printf(). Kann mir jemand einen Tip geben, wie ich sowas
implementieren könnte?
|
Das geht in C++ nicht. Mangels Reflections kann man im nachhinein
niemans feststellen, mit welchen Datentypen die Funktion aufgerufen
wurde. Deshalb gibt es bei printf ja die %... Ausdrücke. Wenn die aber
nicht zu 100% passen, passieren ganz böse Dinge. Und da Datentypen wie
size_t auf verschiedenen Plattformen verschieden lang sein können (mal
int mal long) bekommt man die Größenangaben (z.B. %lu) nicht portabel in
den Griff.
In C++ gibt es folgenden Ausweg:
class myLog
{ ostream* LogStream;
template <typename P1>
void Log(P1 p1)
{ LogStream << p1 << endl;
}
template <typename P1, typename P2>
void Log(P1 p1, P2, p2)
{ LogStream << p1 << " " << p2 << endl;
// das wird man wahrscheinlich etwas schöner haben wollen
}
...
}
Da man typischerweise nicht mehr als eine Hand voll Parameter für den
Zweck braucht, ist der Aufwand endlich.
Alternative 2:
boost::format
-> www.boost.org
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Mar 29, 2006 4:06 pm Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) |
|
|
"kanze" <kanze@gabi-soft.fr> writes:
| Quote: | Und ein Warmduscher bin ich auch, zumindest wenn's ums
Programmieren geht - ich würde mindestens
#define LOG(msg) (logfile << (msg) << std::endl)
schreiben.
Dann funktionniert es nicht mehr.
|
:-)
Stimmt.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|