динамическое создание списка _в GCC -можно ли это сделать?

моя проблема с 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?
}
8
задан John Drouhard 4 June 2015 в 04:58
поделиться

1 ответ

Если проблема, которую Вы пытаетесь решить, вставляет передающие произвольные типы в функцию в 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 об этом ответе, не работающем на двойную точность.

-1
ответ дан Stephen Quan 5 December 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: