[c++] String printen voor andere string

Pagina: 1
Acties:

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 18-04 20:51
Ik heb nu deze functie,

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void
elog(enum err_level level, const char *fmt, ...)
{
    va_list     ap;

    if (ctx.debug == 0 && level == ERR_DEBUG)return;
    
    if( !fmt ) return;
    va_start(ap, fmt);
    vprintf( "[HTTPD]"+fmt, ap );
    va_end(ap);

    if (level == ERR_FATAL)
        exit(EXIT_FAILURE);
}

zoals je misschien al gelijk ziet werkt deze niet correct, de bedoeling is dat [httpd] voor elke error msg komt. De manier waar op ik het hier probeerde gaat natuurlijk niet werken, maar is er ook een andere manier? (1 keer vprintf aanroepen)

Edit: eigenlijk zou ik ook wel de datum er voor willen printen...

[ Voor 11% gewijzigd door whoami op 10-12-2005 20:35 . Reden: Even code tags rond je code gezet... ]

http://www.tweakers.net/gallery/119170/sys


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je weet dat printf en alle andere smaken van die functie meerdere parameters accepteren? Bekijk de manual van die functie gewoon eens? :?

Sowieso, als je C++ gebruikt, waarom gebruik je dan niet cout?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

(std::string("[httpd]") + std::string(fmt)).c_str()

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 18-04 20:51
als ik cout gebruik, gaat het linken fout. Ik zal de manual nog maar even doorlezen dan.

(std::string("[httpd]") + std::string(fmt)).c_str() werkt niet goed...

http://www.tweakers.net/gallery/119170/sys


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

-lstdc++

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Kan je niet gewoon zoiets doen?
printf("[HTTPD]");
vprintf(fmt, ap );


[edit]
Dit werkt bij mij gewoon:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdarg.h>
#include <stdio.h>

void printje(const char *fmt, ...) {
  va_list ap;

  va_start(ap, fmt);

  printf("Testje: ");
  vprintf(fmt, ap );

  va_end(ap);
}

int main() {
  printje("%d\n", 10);
  return 0;
}

[ Voor 70% gewijzigd door Daos op 09-12-2005 22:39 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
t Is verreweg de meest eenvoudige manier ja. Ik denk wel dat TS nog even rekening moet houden met va_start/va_end in het geval hij niet wil printen (stack moet toch opgeruimd worden) maar ik moet toegeven dat ik dat niet zeker weet (ik heb al heel lang geen ellipsis functies meer geschreven, hooguit aangepast)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Daos
  • Registratie: Oktober 2004
  • Niet online
MSalters schreef op zaterdag 10 december 2005 @ 17:12:
... Ik denk wel dat TS nog even rekening moet houden met va_start/va_end in het geval hij niet wil printen (stack moet toch opgeruimd worden) maar ik moet toegeven dat ik dat niet zeker weet (ik heb al heel lang geen ellipsis functies meer geschreven, hooguit aangepast)
Een functie (en dus ook als hij daarin va_start/va_end gebruikt) verandert niets aan de hoeveelheid argumenten op de stack. De stack wordt namelijk gevuld met argumenten door de aanroeper en ook het verwijderen van de argumenten wordt gedaan door de aanroeper.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nee, dat is maar een mogelijke implementatie. Sterker nog, er zijn genoeg compilers, vooral in de RISC wereld, die registers gebruiken in plaats van de stack (ja, ook voor va_arg). De regels voor va_arg zijn zo gemaakt dat ze op elk platform kunnen werken. Dat op sommige platforms onder sommige optimalisaties er geen nadelige effecten zijn als je het niet doet, betekent ng niet dat dat overal mag.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1