C 函数指针数组中出现错误

C 函数指针数组中出现错误,c,function-pointers,C,Function Pointers,我正试图学习这个CLI程序,但面临函数指针数组的问题。我正在尝试使用示例代码并使用相同的代码来更好地理解概念 这是一个语法错误,我可以在这里找到错误的地方 (*func_ptr[input.opInput])() 我得到的错误如下 “错误:被调用的对象不是函数或函数指针” #包括 #包括 #包括 枚举操作{ADD, 搜索, 列表 删除, 错误}; 结构数据{ int-id; 字符名[20]; char-arch[20]; 浮动射频频率; }; //此结构将动态创建 结构命令{ 枚举操作输出

我正试图学习这个CLI程序,但面临函数指针数组的问题。我正在尝试使用示例代码并使用相同的代码来更好地理解概念

这是一个语法错误,我可以在这里找到错误的地方

(*func_ptr[input.opInput])()

我得到的错误如下

“错误:被调用的对象不是函数或函数指针”

#包括
#包括
#包括
枚举操作{ADD,
搜索,
列表
删除,
错误};
结构数据{
int-id;
字符名[20];
char-arch[20];
浮动射频频率;
};    //此结构将动态创建
结构命令{
枚举操作输出;
int-id;
字符名[20];
char-arch[20];
浮动射频频率;
};
//=============函数原型===============
void parseInput(char*inputStr,struct命令*cmd);
void createNode(结构数据*节点);
void deleteNode(结构数据*节点);
//支持的命令输入列表
无效添加();
无效搜索();
作废清单();
作废删除();
//===============================================
void(*func_ptr[4])={添加、搜索、列表、删除};
内部主(空){
结构命令输入;
字符输入[80];
printf(“欢迎使用CLI界面\n请插入有效命令”);
printf(“有效输入格式为-->”;
printf(“wsn>命令名arch rf_frequency\n”);
printf(“---------------------------------------------------------------\n”);
而(1){
printf(“wsn>”);
fgets(cliInput,80,标准输入);
parseInput(cliInput和input);
(*func_ptr[input.opInput])();//错误
}//结束时1
}//干管末端
void parseInput(char*inputStr,struct命令*cmd){
char*tknsrs[6];
int ii=0;
tknstrs[ii]=strtok(inputStr,“\n”);
而(tknstrs[ii]){
tknstrs[++ii]=strtok(空,“\n”);
}
如果(strcmp(tknstrs[0],“add”)==0)
cmd->opInput=添加;
else if(strcmp(tknstrs[0],“搜索”)==0)
cmd->opInput=搜索;
否则如果(strcmp(tknstrs[0],“列表”)==0)
cmd->opInput=列表;
else if(strcmp(tknstrs[0],“delete”)==0)
cmd->opInput=删除;
其他的
cmd->opInput=错误;
cmd->id=atoi(tknstrs[1]);
strcpy(cmd->name,tknstrs[2]);
strcpy(cmd->arch,tknstrs[3]);
cmd->rf_freq=atof(tknstrs[4]);
}//输入函数结束
void add(){
}
无效搜索(){
}
作废清单(){
}
作废删除(){
}

感谢您的努力,非常感谢。

您使用了错误的声明:

void (*func_ptr[4])={add,search,list,delete};
应该是

void (*func_ptr[4])()={add,search,list,delete};
-------------------^^ You need also the type of the parameters or empty
请注意,您不需要指定数组的元素数(可以避免键入4)

此外,如果函数不接受参数,则更喜欢使用
void

void (*func_ptr[])(void)={add,search,list,delete};
并更改原型:

void add(void);

谢谢@Keine Lust,它解决了这个问题。我这边有个简单的syantx错误。“strcpy(cmd->name,tknstrs[2])处的给定段错误;strcpy(cmd->arch,tknstrs[3]);“有什么想法吗?是的,你需要空间来存储那些字符串,
char*tknstrs[6];
是一个指针数组,你需要像
char-tknstrs[6][50];
,另一个选项是使用
tknstrs[0]=malloc(50)为这些指针保留空间。”
如果要使用堆或堆栈,则由您决定。嘿…问题在于tknstrs[]的大小。将指针大小增加到10解决了问题。谢谢Keine。请注意,如果您将数组的大小指定为
[]
并对其进行初始化,编译器将使其成为初始值设定项列表的大小。此外,如果您不打算更改数组或变量的内容,明智的做法是将其声明为
const
void add(void);