2010-12-14 5 views
0

管理対象のC++コードを64ビットに移行しようとしています。 私はvarargsを取得する関数を持っており、System :: String変数を渡すと、正しく渡されないように見えます。 ここで問題を示すコードの簡略化である:Varargsは管理オブジェクトで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

問題はマネージコードとvarargsの組み合わせにあるように見えます。彼らはnot compatible with each otherと思われます。

これはなぜ32ビットで動作するのかわかりませんが、間違っているように見えます。

私はコードを変更して、マネージコードだけになり、varargsはありません。

0

%s指定子は、System :: String ^ではなくCスタイルのヌル終了文字列を必要とします。 C++/CLIヘッダーは、System :: String ^をstd :: stringに変換できるメソッドを提供しています。これはC文字列に変換でき、おそらくまっすぐにC文字列に変換できます。

他にも問題があります。 void main()? char *へのリテラルの割り当て?固定サイズのバッファ?

+0

%s指定子はSystem :: String ^を受け入れます。私がvarargsを通過しない場合、これは完全に動作します。 これは、問題を示すためにコードを単純化したものです。私はこのコードを素敵にすることには興味がありません。私はそれが動作するように、私は '実際のコードに解決策を取ることができます。 –

関連する問題