这可能是个愚蠢的问题,但我的代码中没有发现错误。
我正在编写简单的命令解析器,它将在其中初始化适当的参数并调用与命令代码相关的适当函数。
例如
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
最佳答案
问题在于您将函数指针转换为采用不同参数类型的函数类型。试图通过这样的指针调用函数是未定义的行为。尽管您可能会逃脱类似的调用 - 例如,返回 myStruct*
代替 void*
指针(虽然它仍然是未定义的行为),你无法转换一个接受 int
的函数。和一个 myStruct*
到采用 int
的函数类型和参数的可变列表。
将您的函数更改为正确的签名以匹配 cmdTableStruct
表修复了这个问题:
void *setParams(paramHandler_type *pHandler);
int printParams(int commandType,... );
static cmdTableStruct cmdTable[]=
{
{ 1123,setParams,printParams },
//more command in same manner
};
当然,现在您需要处理来自 ...
的参数使用 <stdarg.h>
中的功能单独列出标题。
此外,您在分配值时取消引用参数处理程序的方式不正确 - 索引应应用于 paramValue
,而不是pHandler
:
*((int*)pHandler->paramValue[j]) = (int)atoi(token);
关于c - 在结构中没有得到正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27981807/