2014-12-19 13 views
0

Я developping на C++/библиотеки CLI и у меня есть следующий класс:Как передать переменные аргументы va_list из управляемого C++ в C#?

public ref class AbstractClassA abstract{ 
    protected: 
    // signature can be changed by me (method will be overriden in C#) 
    virtual void write(String^str, String^format, ...array<Object^> ^args) = 0; 
    internal: 
    // signature cannot be changed by me 
    void internWrite(const char *str, const char *format, va_list args){ 
     write(gcnew String(str), gcnew String(format), ???)} 
}; 

Метод «internWrite» должен вызвать метод «Methoda», но я не могу найти, как конвертировать параметр 'va_list' для управляемого массива. Я нашел несколько интересных сообщений [1], [2], но для упомянутых решений требуется иметь длину va_list. У меня нет этой информации, и я не могу изменить подпись 'internWrite'.

Я могу изменить подпись 'написать'.

Как преобразовать va_list в управляемый переменный массив args?

[EDIT] Комментариев методы упоминания 'internWrite':

-format + арг: отформатированная печать, такой же синтаксис, как функции PRINTF

Может быть, мне нужно использовать параметр 'формат', чтобы получить длину va_list (как указано на length of va_list when using variable list arguments?). Но как я могу это сделать? Как это делает команда printf?

[EDIT] Выполнение гипотезы о том, что формат + args имеет тот же синтаксис, что и printf, я создаю метод для получения длины agrs (по countinh '%'). Вот мой код в данный момент:

void write(char *format, va_list args){ 
    String^ mgFormat = gcnew String(format); 
    int nbArgs = sizeOfArgs(format); 
    array<Object^>^ mgArgs = gcnew array<Object^>(nbArgs); 

    va_start(args, format); 
    for (int _i = 0; _i < nbArgs; ++_i){ 
     mgArgs[_i] = va_arg(args, int); // not sure the type is int ... how to know ? 
    } 
    va_end(args); 
    internWrite(mgFormat, mgArgs); 
    } 

Но теперь я stucked о добавлении каждого объекта Арг в массив, так как макрос «va_arg» требует типа текущего аргумента. У меня нет этой информации. Как перебрать va_list и заполнить мой управляемый массив?

[1] How do I pass variable arguments from managed to unmanaged with a C++/CLI Wrapper?
[2] Calling a .NET function with variable number of parameters from unmanaged code

+0

Для управляемом C++/# вы должны использовать 'params' ключевое слово:' FUNC (PARAMS объект [] Arg); '. – i486

+1

Если у вас нет возможности получить длину va_list, это звучит довольно безнадежно. – Medinoc

+0

Как я вижу, у вас есть строка формата, которая отлично определяет количество аргументов, ожидаемых после их разбора. Для строки формата, подобной printf, вы можете считать эти символы «%» в строке формата, которым не присваивается символ «%», которому предшествует или сразу же не удается. –

ответ

0

Похоже, что вам нужно разобрать аргумент формата, для того, чтобы определить, как количество аргументов и тип аргументов. Кажется, что va_list не содержит информацию о типе.

Предложение, если вы действительно хотите спуститься по этой дороге, состоит в том, чтобы прочитать документацию vsnprintf, но, похоже, какая-то работа впереди вас!

Даже

Смежные вопросы