4

私の問題vsprintfは、入力引数を直接取得できないことです。最初に入力を1つずつ取得してに保存し、次にこれをにvoid**渡す必要があります.Windowsでは問題ありませんが、64ビットLinuxになるとgccはコンパイルできませんからへの変換は許可されていないため、Linux でどのようにすればよいか助けてくれる人はいますか?void**vsprintf()void**va_list

私のコードの一部は次のとおりです。

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 
}

大変感謝します!!

4

1 に答える 1

1

問題は、関数が を取得...しているのに、 を渡していることva_listです。...次のような用途に使用されます。

 getInputArgs(s, formatString, arg1, arg2, arg3, arg4 /* etc */);

では動作しませんva_list。残念ながら、va_listから取得するのではなく、異なるパラメータからを作成する簡単な方法はありません...。たとえば、この質問を参照してください。

あなたがすべきことは、文字列に印刷したい方法を変更することです。

あなたが持つことができます:

char s[256];
int so_far = 0;

そして、次のような代わりに for ループで:

CopyInDoubleArg(i, TRUE, &tempValue);   //lib func
args_ptr[i-2] = (void*) (int)tempValue;

あなたが書く:

CopyInDoubleArg(i, TRUE, &tempValue);   //lib func
if (so_far < 256)  /* 256 is the maximum length of s */
    so_far += snprintf(s + so_far, 256 - so_far, "%lf", tempValue);

これらの線に沿った何か。このようにして、一度にすべてを作成しようとするのではなく、各要素を前の要素に追加して、文字列を 1 つずつ作成します。

于 2012-07-27T16:00:38.410 に答える