我正在尝试学习这个CLI程序,但面临一个函数指针数组的问题。我正在尝试使用示例代码并使用相同的代码来更好地了解概念。
它是一个语法错误,我可以追踪这里的错误。
(* func_ptr [input.opInput])();
我收到错误
“错误:被调用的对象不是函数或函数指针”。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum operation {ADD,
SEARCH,
LIST,
DELETE,
ERROR};
struct data{
int id;
char name[20];
char arch[20];
float rf_freq;
}; //This struct will be dynamically created
struct command {
enum operation opInput;
int id;
char name[20];
char arch[20];
float rf_freq;
};
//===========Function proto typing===============
void parseInput(char *inputStr,struct command *cmd);
void createNode(struct data *node);
void deleteNode(struct data *node);
//List of command input supported
void add();
void search();
void list();
void delete();
//===============================================
void (*func_ptr[4])={add,search,list,delete};
int main(void){
struct command input;
char cliInput[80];
printf("Welcome to CLI interface \n Please insert valid command\n");
printf("Valid input format is---->");
printf("wsn> command name arch rf_frequency\n");
printf("--------------------------------------------------------\n");
while(1){
printf("wsn>");
fgets(cliInput,80,stdin);
parseInput(cliInput,& input);
(*func_ptr[input.opInput])(); //ERROR
}//end of while 1
}//end of main
void parseInput(char *inputStr,struct command *cmd){
char *tknstrs[6];
int ii=0;
tknstrs[ii]=strtok(inputStr," \n");
while(tknstrs[ii]){
tknstrs[++ii]=strtok(NULL," \n");
}
if(strcmp(tknstrs[0],"add")==0)
cmd->opInput=ADD;
else if(strcmp(tknstrs[0],"search")==0)
cmd->opInput=SEARCH;
else if(strcmp(tknstrs[0],"list")==0)
cmd->opInput = LIST;
else if(strcmp(tknstrs[0],"delete")==0)
cmd->opInput = DELETE;
else
cmd->opInput = ERROR;
cmd->id=atoi(tknstrs[1]);
strcpy(cmd->name,tknstrs[2]);
strcpy(cmd->arch,tknstrs[3]);
cmd->rf_freq = atof(tknstrs[4]);
}//end of parseInput function
void add(){
}
void search(){
}
void list(){
}
void delete(){
}
感谢您的努力,感谢您。
答案 0 :(得分:3)
您使用的是错误的声明:
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);