моя проблема с vsprintf
заключается в том, что я не могу получить входные аргументы напрямую, я должен сначала получить входные данные один за другим и сохранить их в void**
, затем передать этот void**
в vsprintf()
, это все нормально для окон, но когда я прихожу к 64-битному Linux, gcc не может скомпилироваться, потому что ему не разрешено конвертировать из void**
в va_list
. Кто-нибудь может мне помочь, как мне это сделать в Linux?
Могу ли я динамически создавать список va _в GCC?
void getInputArgs(char* str, char* format,...)
{
va_list args;
va_start(args, format);
vsprintf(str, format, args);
va_end(args);
}
void process(void)
{
char s[256];
double tempValue;
char * tempString = NULL;
void ** args_ptr = NULL;
ArgFormatType format; //defined in the lib I used in the code
int numOfArgs = GetNumInputArgs(); // library func used in my code
if(numOfArgs>1)
{
args_ptr = (void**) malloc(sizeof(char)*(numOfArgs-1));
for(i=2; i<numOfArgs; i++)
{
format = GetArgType(); //library funcs
switch(format)
{
case ArgType_double:
CopyInDoubleArg(i, TRUE, &tempValue); //lib func
args_ptr[i-2] = (void*) (int)tempValue;
break;
case ArgType_char:
args_ptr[i-2]=NULL;
AllocInCharArg(i, TRUE, &tempString); //lib func
args_ptr[i-2]= tempString;
break;
}
}
}
getInputArgs(s, formatString, (va_list) args_ptr); //Here
// is the location where gcc cannot compile,
// Can I and how if I can create a va_list myself?
}
Если проблема, которую Вы пытаетесь решить, вставляет передающие произвольные типы в функцию в va_list
стиль, то, рассмотрите использование union
:
#include <iostream>
#include <cstdarg>
union ARG
{
int d;
char* s;
double f;
};
int main()
{
printf("%d %s %f \n", 1, "two", 3.1415 );
// Output: 1 two 3.141500
char format[ 1024 ] = "%d %s %f\n";
ARG args[ 5 ] = { };
args[ 0 ].d = 1;
args[ 1 ].s = "two";
args[ 2 ].f = 3.1415;
printf( format, args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ] );
// Output: 1 two 3.141500
return 0;
}
Некоторые вещи Вы отметите о моем решении:
format
и args
. Протестированный это на: - Ubuntu, g ++ - Android NDK
я сделал еще некоторое тестирование, и, подтвердил комментарии @PeterCoordes об этом ответе, не работающем на двойную точность.