Я 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
Для управляемом C++/# вы должны использовать 'params' ключевое слово:' FUNC (PARAMS объект [] Arg); '. – i486
Если у вас нет возможности получить длину va_list, это звучит довольно безнадежно. – Medinoc
Как я вижу, у вас есть строка формата, которая отлично определяет количество аргументов, ожидаемых после их разбора. Для строки формата, подобной printf, вы можете считать эти символы «%» в строке формата, которым не присваивается символ «%», которому предшествует или сразу же не удается. –