可能是一个愚蠢的问题,但没有弄清楚我的代码中的错误。
我正在编写简单的命令解析器,它将初始化适当的参数并调用与命令代码相关的适当函数。
实施例
char buffer[]="1123,13,46";
在上面的行1123
中是命令代码,其余的两个令牌是参数。在解析器中,它将首先找到命令代码形式命令表,如果找到命令,则它将使用上述参数初始化该命令的结构。
目前在我的代码中,我成功从命令表中获取正确的命令并调用该命令的函数但未能使用上述值初始化参数(此处为13和46)。始终获取0
。
根据下面的代码,我想在命令解析器中使用同样的东西,但很少修改
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;
}
请找到我的工作源文件here
头文件here
答案 0 :(得分:1)
问题是您正在将函数指针转换为采用不同参数类型的函数类型。试图通过像这样的指针调用函数是未定义的行为。虽然你可以通过相似的调用来逃避 - 比如,返回myStruct*
代替void*
指针(虽然它仍然是未定义的行为),但是你无法投射一个带{的函数{1}}和int
到函数类型,它带有myStruct*
和变量参数列表。
将函数更改为正确的签名以匹配int
表可以解决此问题:
cmdTableStruct
当然,您现在需要使用void *setParams(paramHandler_type *pHandler);
int printParams(int commandType,... );
static cmdTableStruct cmdTable[]=
{
{ 1123,setParams,printParams },
//more command in same manner
};
标题中的功能单独处理...
列表中的参数。
此外,在分配值时取消引用param处理程序的方式不正确 - 索引应该应用于<stdarg.h>
,而不是paramValue
:
pHandler