Varargs не работает в 64-битных с управляемыми объектами? - PullRequest
0 голосов
/ 14 декабря 2010

Я пытаюсь перевести некоторый управляемый код c ++ на 64 бита. У меня есть функция, которая получает varargs, и когда я передаю ей переменную System :: String, кажется, что она не проходит правильно. Вот упрощение кода, который показывает проблему:

    #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 битах, он отображает Hello Shahar.

Когда он работает в 64 битах, он отображает Hello Çz∟⌠ ■.

Если я хочу внести наименьшее количество изменений в код, как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

Похоже, что проблема заключается в смешении управляемого кода и varargs. Похоже, что они не совместимы друг с другом .

Я не знаю, почему это работает в 32-битном режиме, но похоже, что это неправильно.

Я изменил код, чтобы он был только управляемым кодом без переменных.

0 голосов
/ 14 декабря 2010

Спецификатор% s ожидает строку с нулем в конце в стиле C, а не System :: String ^. Заголовки C ++ / CLI предоставляют некоторые методы, которые могут преобразовывать System :: String ^ в std :: string, которые можно преобразовать в C-строку и, вероятно, просто преобразовать в C-строку.

У вас есть и другие проблемы. пустая функция()? Назначение литерала для символа *? Буфер фиксированного размера?

...