2010-12-14 72 views
0

J'essaye de faire migrer du code C++ managé vers 64bits. J'ai une fonction qui obtient varargs, et quand je lui passe une variable System :: String, elle semble ne pas passer correctement. Voici une simplification du code qui montre le problème:Varargs ne fonctionne pas en 64 bits avec des objets gérés?

#include <stdio.h> 
    #include <stdarg.h> 
    void test(char* formatPtr, ...) 
    { 
     va_list args; 
     int bufSize; 
     char buffer[2600]; 

     ///////////////////////////////////// 
     //parse arguments from function stack 
     ///////////////////////////////////// 
     va_start(args, formatPtr); 

     bufSize = vsprintf(buffer, (const char*) formatPtr, args); 
     printf(buffer); 

     va_end(args); 
    } 

    void main() { 
     System::String^ s; 
     s = "Shahar"; 
     test("Hello %s", s); 
     getchar(); 
    } 

Lorsque ce code est exécuté en 32 bits, il affiche Bonjour Shahar. Lorsqu'il est exécuté en 64 bits, il affiche Bonjour Çz∟⌠ ■.

En supposant que je veux apporter le moins de changements au code, comment dois-je résoudre ce problème?

Répondre

0

Il semble que le problème soit dans le mélange entre code managé et varargs. Il semble qu'ils sont not compatible with each other. Je ne sais pas pourquoi cela fonctionne en 32 bits, mais cela ne semble pas être la bonne chose à faire.

J'ai changé le code, afin d'être seulement du code managé, sans varargs.

0

Le spécificateur% s attend une chaîne terminée par un caractère nul de style C, pas un System :: String ^. Les en-têtes C++/CLI fournissent des méthodes qui peuvent convertir System :: String^en std :: string, qui peuvent être converties en une chaîne de caractères C et qui peuvent probablement être converties directement en C-string.

Vous avez également d'autres problèmes. void principal()? Affectation d'un littéral à un caractère *? Tampon de taille fixe?

+0

Le spécificateur% s accepte bien System :: String ^. Si je ne passe pas par Varargs, cela fonctionne parfaitement. Ceci est juste une simplification du code, pour montrer le problème. Je ne suis pas intéressé à rendre ce code sympa. Je veux que cela fonctionne, ainsi je peux prendre la solution au «vrai» code. –