2010-12-14 29 views
0

我正試圖將一些託管的C++代碼遷移到64位。 我有一個函數,獲取可變參數,當我傳遞一個System :: String變量給它時,它似乎不能正確傳遞。 這裏是示出該問題的代碼的簡化:可變參數無法在64位與託管對象?

#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(); 
    } 

當該代碼在32位運行時,它顯示你好沙哈爾。

當它以64位運行時,它顯示HelloÇz∟⌠■。

假設我想對代碼進行最少量的更改,應如何解決此問題?

回答

0

看起來問題在於託管代碼和可變參數之間的混合。看起來他們是not compatible with each other

我不知道爲什麼它在32位工作,但它看起來像做錯了什麼。

我改變了代碼,以便只有託管代碼,沒有可變參數。

0

%s說明符需要一個C風格的以null結尾的字符串,而不是System :: String ^。 C++/CLI頭文件提供了一些可以將System :: String ^轉換爲std :: string的方法,std :: string可以轉換爲C字符串,也可以直接轉換爲C字符串。

您還有其他問題。 void main()?分配一個文字到char *?固定大小的緩衝區?

+0

%s說明符接受System :: String ^就好了。如果我沒有通過可變參數,這完美地工作。 這只是代碼的簡化,以顯示問題。我不想讓這段代碼更好。我希望它能夠工作,所以我可以將解決方案用於「真實」代碼。 – 2010-12-14 14:12:11

相關問題