C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Dynamische Parameterliste (wie z.B. prinft())

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
MARS_3-142
Guest





PostPosted: Mon Mar 27, 2006 10:06 pm    Post subject: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote



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





PostPosted: Mon Mar 27, 2006 11:06 pm    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote



"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





PostPosted: Tue Mar 28, 2006 9:06 pm    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote



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





PostPosted: Tue Mar 28, 2006 11:06 pm    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote

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





PostPosted: Wed Mar 29, 2006 7:06 am    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote

Falk Tannhäuser <tannhauser86549spam (AT) free (DOT) fr> writes:

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

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





PostPosted: Wed Mar 29, 2006 10:06 am    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote

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





PostPosted: Wed Mar 29, 2006 12:06 pm    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote

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





PostPosted: Wed Mar 29, 2006 3:06 pm    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote

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





PostPosted: Wed Mar 29, 2006 4:06 pm    Post subject: Re: Dynamische Parameterliste (wie z.B. prinft()) Reply with quote

"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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.