Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C/C++]Eigen printf maken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dag mensen,

Ik wil graag een eigen versie van printf, voor het wegschrijven van debugmessages, bijv:

debugf("%s heeft verbinding gemaakt, gebruikersnaam %s\n", ipadress, username);

Ik wil dus een functie maken die een variabel aantal argumenten aankan en die op zijn beurt gebruik maakt van sprintf. Hoe maak het aantal argumenten variabel? Aan stdarg heb ik weinig, want ik moet de variabelen weer gebruiken in sprintf, als deze in een array zitten heb ik hier niks aan, omdat printf ze als losse argumenten verwacht.

Ik vroeg me af of wat ik wil wel mogelijk is en zo ja of iemand weet hoe dat moet

bij voorbaat dank

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 18-11 19:36
Ga eens kijken naar de va_start, va_arg, en va_end functies. Dan kom je er wel uit waarschijnlijk.

zeroxcool.net - curity.eu


Verwijderd

Topicstarter
Nee, dat lukt niet.

In de implementatie van debugf moet ik sprintf gebruiken en met va_arg kan ik maar 1 argument tegelijk ophalen.

Debubf moet er dus ongeveer zo uitkomen te zien:

debugf(char* format, <arguments>) {
char buffer[250];
sprintf(buffer, format, <agruments>);
....
}

  • doctormetal
  • Registratie: Februari 2006
  • Laatst online: 12-11 16:05
Verwijderd schreef op donderdag 01 mei 2008 @ 12:15:
Nee, dat lukt niet.

In de implementatie van debugf moet ik sprintf gebruiken en met va_arg kan ik maar 1 argument tegelijk ophalen.

Debubf moet er dus ongeveer zo uitkomen te zien:

debugf(char* format, <arguments>) {
char buffer[250];
sprintf(buffer, format, <agruments>);
....
}
beetje zoeken kan geen kwaad: eerste hit op google naar vprintf: http://www.cppreference.c...tf_vfprintf_vsprintf.html

  • joppybt
  • Registratie: December 2002
  • Laatst online: 08:36
Zoiets?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void debugf(LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);

    int nBuf;
    char szBuffer[512];

    nBuf = _vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    
    OutputDebugString(szBuffer); // Of wat je er maar mee doen wilt
   
    va_end(args);
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mooie Microsoft code. En nu in C++ ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 18-11 19:30

Sebazzz

3dp

.oisyn schreef op donderdag 01 mei 2008 @ 20:01:
Mooie Microsoft code. En nu in C++ ;)
Dat ondersteunt de C++ compiler van Microsoft niet :P En zo zijn er nog wel andere dingen: Probeer bijvoorbeeld maar eens windows te includen in plaats van windows.h ;(
In C++ zouden header bestanden geen extensie moeten hebben, je kan de specificatie erop naslaan. :)

@hieronder: Nee, maar wel het feit dat header bestanden geen externsie zouden moeten hebben.

[ Voor 33% gewijzigd door Sebazzz op 01-05-2008 20:39 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Sebazzz schreef op donderdag 01 mei 2008 @ 20:08:
[...]
Dat ondersteunt de C++ compiler van Microsoft niet :P En zo zijn er nog wel andere dingen: Probeer bijvoorbeeld maar eens windows te includen in plaats van windows.h ;(
In C++ zouden header bestanden geen extensie moeten hebben, je kan de specificatie erop naslaan. :)
Windows.h is dan ook géén onderdeel van de C++ specificatie.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sebazzz schreef op donderdag 01 mei 2008 @ 20:08:
[...]
Dat ondersteunt de C++ compiler van Microsoft niet :P
Mijn punt was dat de TS een C++ implementatie wil maken, en niet heeft gezegd dat hij daarbij een compiler van MS wil gebruiken. Ik snap je opmerking dus niet.
En zo zijn er nog wel andere dingen: Probeer bijvoorbeeld maar eens windows te includen in plaats van windows.h ;(
In C++ zouden header bestanden geen extensie moeten hebben, je kan de specificatie erop naslaan. :)

@hieronder: Nee, maar wel het feit dat header bestanden geen externsie zouden moeten hebben.
Interessant, kun je dat deel uit de standaard eens quoten? Want dat stukje ken ik namelijk niet. Wat ik wel ken, is dat ze in ISO/IEC 14882:2003 (de recentste C++ standaard dus) voorbeelden gebruiken waarin ze headers namen geven als "a.h" en "b.h" (zie bijvoorbeeld het voorbeeld in 3.6.2/3). Ook zeggen ze dat je zelfs de .h variant van de standaard C headers mag includen, bijvoorbeeld als je compatible wilt blijven met C, maar dat de C++ variant van de C headers wel geprefereerd (dus niet verplicht) zijn - zie de voetnoot onder 17.4.1.2/7. En hey, laat windows.h nou net een header zijn die ook C-compatible is.

[ Voor 25% gewijzigd door .oisyn op 01-05-2008 21:53 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Verwijderd schreef op donderdag 01 mei 2008 @ 12:15:
In de implementatie van debugf moet ik sprintf gebruiken en met va_arg kan ik maar 1 argument tegelijk ophalen.
Waarom moet dat?

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 06-11 13:54
Je kunt een va_list voeren aan vprintf() en vfprintf(). Samen met de bovenstaande replies over het gebruik va_list moet je er wel uitkomen ;).

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 10:02

Super_ik

haklust!

kom je niet weg met een macro?
code:
1
#define debugf(fmt, args...) sprintf(file_stream, fmt, ##args)

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Super_ik schreef op vrijdag 02 mei 2008 @ 19:29:
kom je niet weg met een macro?
code:
1
#define debugf(fmt, args...) sprintf(file_stream, fmt, ##args)
Hoewel onderdeel van de huidige C standaard, zijn variadic marcro's het geen onderdeel van de huidige C++ standaard. Echter, de meeste compiler shippen wel met een implementatie voor C++.
Pagina: 1