Jayesh Bhoi
Jayesh Bhoi

Reputation: 25885

Not getting correct value in structure

might be it's silly question but not getting what is wrong in my code.

I am writing simple command parser in which it will initialize appropriate parameters and call appropriate functions related to command code.

Ex.

char buffer[]="1123,13,46";

In above line 1123 is command code and rest of two tokens are parameters. In parser it will first find command code form command table and if command found then it will initialize structure of that command with above parameters.

Currently in my code i am successfully fetching correct command from command table and call that command's functions but failed to initialize the parameters with above values (13 and 46 here).Always getting 0.

As per below code same thing i want in my command parser but little modification

typedef struct
{
    void *fields[2];

}tmpStruct;

typedef struct
{

    int x;
    int y;

}myStruct;

tmpStruct tmp_struct;

myStruct *getParams(tmpStruct *t_struct)
{
    myStruct *genericStruct = malloc(sizeof(myStruct));

        //setup the order of the fields in the handler
    t_struct->fields[0]=(void*)&genericStruct->x;

    t_struct->fields[1]=(void*)&genericStruct->y;

    return genericStruct;
}

void *fillValue(tmpStruct *t_struct)
{
    void *genericStruct;

    genericStruct = getParams(t_struct);

    *((int*)t_struct->fields[0])=12;
    *((int*)t_struct->fields[1])=13;

    return genericStruct;
}

void pritValue(myStruct *my_struct)
{
    printf("%d  %d\n",my_struct->x,my_struct->y);
}

int main()
{
    void *genericStruct;

    genericStruct = fillValue(&tmp_struct);

    pritValue(genericStruct);

    return 0;
}

Please find my working source file here

And header file here

Upvotes: 1

Views: 86

Answers (1)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726639

The problem is that you are casting function pointers to types of functions that take different parameter types. Trying to make calls to functions through pointers like that is undefined behavior. Although you could potentially get away with calls that are similar - say, return myStruct* in place of void* pointer (although it's still undefined behavior), there is no way you could cast a function that takes an int and a myStruct* to a function type that takes an int and a variable list of arguments.

Changing your functions to the correct signatures to match cmdTableStruct table fixes this problem:

void *setParams(paramHandler_type *pHandler);
int printParams(int commandType,... );

static cmdTableStruct cmdTable[]=
{
 { 1123,setParams,printParams },
 //more command in same manner
};

Demo.

Of course now you need to handle parameters from the ... list individually using the functionality from the <stdarg.h> header.

Also, the way you dereference param handler when assigning values is incorrect - the index should be applied to paramValue, not to pHandler:

*((int*)pHandler->paramValue[j]) = (int)atoi(token);

Upvotes: 1

Related Questions