2009-05-21 8 views
2

Ich stehe vor einem seltsamen Problem. Ich verwende sprintf oder swprintf entsprechend dem Build definiert mit oder ohne Unicode. Ich habe diese Funktionen in meiner eigenen Funktion wie folgt gewickelt:Der Aufruf von swprint aus einer separaten lib schlägt fehl

int mysprintf(MCHAR* str,size_t size, const MCHAR* format, ...) 
{ 
#ifdef MYUNICODE 
    return swprintf(str, size, format); 
#else 
    return snprintf(str, format); 
#endif 
} 

Diese Funktion ist in einer String-Klasse, die ein eigenständiges Projekt ist und als lib zusammengestellt. Ich benutze es in einem anderen Programm. Wenn ich nun das mysprintf()

msprintf(str,10, _M("%d,%d"),height,width); 

verwende, bekomme ich einige Garbage-Werte im String-Puffer. Aber wenn ich die Funktion swprintf direkt aus dem Programm heraus anrufe, funktioniert das mit Geldstrafen. Ich habe UNICODE im Build definiert und die Funktion swprintf wird aufgerufen, aber es füllt einige Werte für den Speicher. Ich verstehe nicht, was falsch läuft.

Dank Amit

Antwort

1

Das Problem liegt tatsächlich darin, dass Sie Ihre eigene Funktion mit variabler Anzahl von Parametern haben. Sie müssen einen Zeiger auf die Liste der Argumente erhalten und diese an die Callees weiterleiten. Mit va_start können Sie genau das tun, und Sie benötigen den letzten Zeiger in der Argumentliste für Ihre Funktion.

int mysprintf(MCHAR* str, size_t size, const MCHAR* format, ...) 
    { 
     va_list args; 
     va_start(args, format); 

     int result; 

    #ifdef MYUNICODE 
     result = vswprintf(str, size, format, args); 
    #else 
     result = .. 
    #endif 

     va_end(args); 

     return result; 
    } 

Prost!

+0

Danke Magnus, das hat das Konzept geklärt. – amit

+0

Anytime Mate :) – ralphtheninja

+0

swprintf() nimmt keine va_list, aber vswprintf() tut. – bk1e

Verwandte Themen