Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.08.2010, 20:38

unbegrenzte anzahl parameter

hallo,

ich schreibe zur Zeit ein Funktion die etwas in eine Logdatei schreiben soll. Das soll so ähnlich gehen wie bei sprintf, dass man einen Formatstring hat und dann eine unbegrenzte Anzahl Parameter. Ich habe mir jetzt gedacht, ich leite die Parameter einfach an sprintf weiter und lass dann von der Funktion den String erstellen, das ist aber garnicht so einfach. Ich kann anhand des Strings rausfinden wie viele Parameter übergeben wurden, theoretisch auch, welchen Typ die haben, aber dann könnte ich auch direkt sprintf selber schreiben... ich brauche irgendeinen anderen ansatz. Mich würde mal interessieren wie ihr sowas implementieren würdet. So siehst aus, ich weiß, dass das total ätzend und unschön ist, aber wills euch trotzdem mal eben zeigen, damit ihr seht welchen Ansatz ich versucht habe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//find the number of arguments
    int ArgumentCount = 0;
    for(int i=0;i<pMessage.size();i++)
    {
        if(pMessage[i] == '%') ArgumentCount++;
    }

    //compose string
    char String[256];
    va_list ArgumentList;
    va_start(ArgumentList, ArgumentCount);
    if(ArgumentCount == 0) sprintf_s(String, 256, pMessage.c_str());
    if(ArgumentCount == 1) sprintf_s(String, 256, pMessage.c_str(), va_arg(ArgumentList, void*));
    if(ArgumentCount == 2) sprintf_s(String, 256, pMessage.c_str(), va_arg(ArgumentList, void*), va_arg(ArgumentList, void*));
    if(ArgumentCount == 3) sprintf_s(String, 256, pMessage.c_str(), va_arg(ArgumentList, void*), va_arg(ArgumentList, void*), va_arg(ArgumentList, void*));
    va_end(ArgumentList);


das würde natürlich nur gehen, wenn ich den Zeiger auf void dereferenzieren könnte...

2

14.08.2010, 20:47

vsprintf vielleicht?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

14.08.2010, 20:47

da du in c++ programmierst(vermute ich einfach mal weil du methoden aufrufst) solltest du einfach ifstream benutzen. einfacher und vorallem sicherer gehts kaum.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

14.08.2010, 21:19

danke schön :)
vsprintf ist genau das was ich gesucht habe :) :) :)

5

15.08.2010, 00:05

Evtl. wären auch die neuen Variadic Templates eine schöne Lösung. Die kann aber glaub ich noch nicht jeder Compiler.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.08.2010, 00:27

Vor allem kann MSVC leider noch keine variadic templates, auch wenn die hier natürlich die schönste Lösung wären...

Werbeanzeige