user-0 提问: 求解一个关于typedef void (*msg)(void)的问题

回复:
user: user-0
content: 引用 14 楼 uuuououlcz 的回复:不好意思，刚写的拙计了，有几个疏忽，可以参考下面的代码：   （1）先定义一个函数名->函数的映射 typedef void (*pFun)(void); map<string, pFun> nameFunMap; nameFunMap.insert(make_pair("hello", &hello)); nameFunMap.insert(make_pair("bye", &bye)); （2）再定义一个缩写->函数名的映射 map<char, string> abbrNameMap; char line[MAX], *p; fp = fopen(initFilePath, "r"); while(fgets(line, MAX, fp)){     if((p = strchr(line, '=')) && p-line == 1){//你用的是一个字母的缩写         abbrNameMap.insert(make_pair(line[0], string(*(p+1))));     } } （3）根据输入的缩写得到函数名，根据函数名调用函数 map<char, string>::iterator abbrNameIter; map<string, pFun>::iterator nameFunIter;  c = getchar(); abbrNameIter = abbrNameMap.find(c);//根据输入的缩写得到函数名 if(abbrNameIter != abbrNameMap.end()){     nameFunIter = nameFunMap.find(abbrNameIter->second);//根据函数名得到函数地址     if(nameFunIter != nameFunMap.end()) *(nameFunIter->second);//调用函数 }  你的思路我大概明白了 我试一下 不胜感激！

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复://函数名是存在配置文件k2fun.cfg中的，如下： //h=hello //b=bye //想要在main()中通过输入一个字母,并读取配置文件，来识别字母对应的函数名，并调用相应的函数。 #include <stdio.h> #include <string.h> #define MAXFUNNAMELEN  30 #define MAXFUNS       100 void unknown() {     printf("unknown\n"); } void hello() {     printf("hello\n"); } void bye() {     printf("goodbye\n"); } FILE *f; typedef void (*pfun)(void); pfun funs[MAXFUNS]; char funnames[MAXFUNS][MAXFUNNAMELEN]; int i,n,L; char c; char ln[1+1+MAXFUNNAMELEN+1+1]; int main() {     funs[0]=hello; strcpy(funnames[0],"hello");     funs[1]=bye;   strcpy(funnames[1],"bye");     for (i=2;i<MAXFUNS;i++) {         funs[i]=unknown;   strcpy(funnames[i],"unknown");     }     f=fopen("k2fun.cfg","r");     if (NULL==f) {         printf("Can not open file k2fun.cfg!\n");         return 1;     }     printf("Input a char:");fflush(stdout);     rewind(stdin);     scanf("%c",&c);     n=0;     while (1) {         if (NULL==fgets(ln,1+1+MAXFUNNAMELEN+1+1,f)) break;         n++;         while (1) {             L=strlen(ln)-1;             if ('\n'==ln[L] || ' '==ln[L]) ln[L]=0;             else break;         }         if ('='!=ln[1]) {             printf("Format Error at line %d:%s\n",n,ln);         } else {             if (c==ln[0]) {                 for (i=0;i<MAXFUNS;i++) {                     if (0==strcmp(ln+2,funnames[i])) {                         funs[i]();                         fclose(f);                         return 0;                     }                 }             }         }     }     fclose(f);     printf("Can not find function of key '%c'!\n",c);     return 2; } //C:\test>test //Input a char:a //Can not find function of key 'a'! // //C:\test>test //Input a char:h //hello // //C:\test>test //Input a char:b //goodbye //  有所启发 谢谢

user: user-1
content: 不好意思，刚写的拙计了，有几个疏忽，可以参考下面的代码：   （1）先定义一个函数名->函数的映射 typedef void (*pFun)(void); map<string, pFun> nameFunMap; nameFunMap.insert(make_pair("hello", &hello)); nameFunMap.insert(make_pair("bye", &bye)); （2）再定义一个缩写->函数名的映射 map<char, string> abbrNameMap; char line[MAX], *p; fp = fopen(initFilePath, "r"); while(fgets(line, MAX, fp)){     if((p = strchr(line, '=')) && p-line == 1){//你用的是一个字母的缩写         abbrNameMap.insert(make_pair(line[0], string(*(p+1))));     } } （3）根据输入的缩写得到函数名，根据函数名调用函数 map<char, string>::iterator abbrNameIter; map<string, pFun>::iterator nameFunIter;  c = getchar(); abbrNameIter = abbrNameMap.find(c);//根据输入的缩写得到函数名 if(abbrNameIter != abbrNameMap.end()){     nameFunIter = nameFunMap.find(abbrNameIter->second);//根据函数名得到函数地址     if(nameFunIter != nameFunMap.end()) *(nameFunIter->second);//调用函数 }

user: user-1
content: 引用 11 楼 lm_whales 的回复:typedef void (*msg)(void); void hello(void){printf("hello\n");} void bye(void){printf("bye\n");}  int getId(char ch) {   if(ch == 'h')return 0;   else if(ch=='b')return 1;   return 2; } void printX(int id); //这么处理行不 void printXbychar(char ch) {     int id =getId(ch);      if(id!=2) printX(id); }   void printX(int id) {  msg words[3]={&hello,&bye};  msg m=map[id]; (*m)(); } C++ 可以用 map<>,makepair 等处理  可以类似这样处理呀：  （1）先定义一个函数名->函数的映射 typedef void (*pFun)(void); map<string, pFun> nameFunMap; nameFunMap.insert(make_pair("hello", &hello)); nameFunMap.insert(make_pair("bye", &bye)); （2）再定义一个缩写->函数名的映射 map<char, string> abbrNameMap; char line[MAX], *p; fp = fopen(initFilePath, "r"); while(fgets(line, MAX, fp)){     if(p = strchr(line, '=') && p-line == 1){//你用的是一个字母的缩写         abbr.insert(make_pair(line[0], string(*(p+1))));     } } （3）根据输入的缩写得到函数名，根据函数名调用函数 map<char, string>::iterator abbrNameIter; map<string, pFun>::iterator nameFunIter;  c = getchar(); abbrNameIter = abbrNameMap.find(c);//根据输入的缩写得到函数名 if(abbrNameIter != abbrNameMap.end()){     nameFunIter = nameFunMap.find(abbrNameIter->second);//根据函数名得到函数地址     if(nameFunIter != nameFunMap.end()) *(nameFunIter->second);//调用函数 }

user: user-2
content: //函数名是存在配置文件k2fun.cfg中的，如下： //h=hello //b=bye //想要在main()中通过输入一个字母,并读取配置文件，来识别字母对应的函数名，并调用相应的函数。 #include <stdio.h> #include <string.h> #define MAXFUNNAMELEN  30 #define MAXFUNS       100 void unknown() {     printf("unknown\n"); } void hello() {     printf("hello\n"); } void bye() {     printf("goodbye\n"); } FILE *f; typedef void (*pfun)(void); pfun funs[MAXFUNS]; char funnames[MAXFUNS][MAXFUNNAMELEN]; int i,n,L; char c; char ln[1+1+MAXFUNNAMELEN+1+1]; int main() {     funs[0]=hello; strcpy(funnames[0],"hello");     funs[1]=bye;   strcpy(funnames[1],"bye");     for (i=2;i<MAXFUNS;i++) {         funs[i]=unknown;   strcpy(funnames[i],"unknown");     }     f=fopen("k2fun.cfg","r");     if (NULL==f) {         printf("Can not open file k2fun.cfg!\n");         return 1;     }     printf("Input a char:");fflush(stdout);     rewind(stdin);     scanf("%c",&c);     n=0;     while (1) {         if (NULL==fgets(ln,1+1+MAXFUNNAMELEN+1+1,f)) break;         n++;         while (1) {             L=strlen(ln)-1;             if ('\n'==ln[L] || ' '==ln[L]) ln[L]=0;             else break;         }         if ('='!=ln[1]) {             printf("Format Error at line %d:%s\n",n,ln);         } else {             if (c==ln[0]) {                 for (i=0;i<MAXFUNS;i++) {                     if (0==strcmp(ln+2,funnames[i])) {                         funs[i]();                         fclose(f);                         return 0;                     }                 }             }         }     }     fclose(f);     printf("Can not find function of key '%c'!\n",c);     return 2; } //C:\test>test //Input a char:a //Can not find function of key 'a'! // //C:\test>test //Input a char:h //hello // //C:\test>test //Input a char:b //goodbye //

user: user-3
content: typedef void (*msg)(void); void hello(void){printf("hello\n");} void bye(void){printf("bye\n");}  int getId(char ch) {   if(ch == 'h')return 0;   else if(ch=='b')return 1;   return 2; } void printX(int id); //这么处理行不 void printXbychar(char ch) {     int id =getId(ch);      if(id!=2) printX(id); }   void printX(int id) {  msg words[3]={&hello,&bye};  msg m=map[id]; (*m)(); } C++ 可以用 map<>,makepair 等处理

user: user-4
content: 文件中只能记录函数名称的字符串，还得通过字符串比较实现函数指针的赋值，要彻底解决你的问题，必须用脚本。  引用 9 楼 vampiresme 的回复:[quote=引用 6 楼 turingo 的回复:] 这样的话，你需要用脚本来做，参考lua脚本与c的相互调用。  原来是这个样子的：  typedef void (*msg)(void); void hello(void){printf("hello\n");} void bye(void){printf("bye\n");} void printX(int id) {  msg words[3]={&hello,&bye};  msg m=map[id]; (*m)(); }  这样就可以通过printX(1),printX(2)来访问不同的函数。 现在hello和bye都是从文件中取了，就不知道怎么调了[/quote]

user: user-0
content: 引用 6 楼 turingo 的回复:这样的话，你需要用脚本来做，参考lua脚本与c的相互调用。  原来是这个样子的：  typedef void (*msg)(void); void hello(void){printf("hello\n");} void bye(void){printf("bye\n");} void printX(int id) {  msg words[3]={&hello,&bye};  msg m=map[id]; (*m)(); }  这样就可以通过printX(1),printX(2)来访问不同的函数。 现在hello和bye都是从文件中取了，就不知道怎么调了

user: user-4
content: 这样的话，你需要用脚本来做，参考lua脚本与c的相互调用。  引用 7 楼 vampiresme 的回复:[quote=引用 1 楼 turingo 的回复:] for(;;) {     if(strcmp(name, "hello") == 0)         hello();     else if(strcmp(name, "bye") == 0)         bye(); }   [quote=引用 楼主 vampiresme 的回复:]  void hello() { 	printf("hello\n"); } void bye() { 	printf("goodbye\n"); }  函数名是存在配置文件中的， 如下： h=hello b=bye 想要在main()中通过输入一个字母,并读取配置文件，来识别字母对应的函数名，并调用相应的函数。 想到可能会用到这个： typedef void (*msg)(void) 但是具体不知道怎么写。[/quote] 配置文件相当于一个函数映射表，bye()，hello()都写进动态库了，主程序不是直接访问每一个方法的，而是通过一个统一的方法来自动映射到配对的方法。可以实现吗？ 一头雾水。。[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:for(;;) {     if(strcmp(name, "hello") == 0)         hello();     else if(strcmp(name, "bye") == 0)         bye(); }   [quote=引用 楼主 vampiresme 的回复:]  void hello() { 	printf("hello\n"); } void bye() { 	printf("goodbye\n"); }  函数名是存在配置文件中的， 如下： h=hello b=bye 想要在main()中通过输入一个字母,并读取配置文件，来识别字母对应的函数名，并调用相应的函数。 想到可能会用到这个： typedef void (*msg)(void) 但是具体不知道怎么写。[/quote] 配置文件相当于一个函数映射表，bye()，hello()都写进动态库了，主程序不是直接访问每一个方法的，而是通过一个统一的方法来自动映射到配对的方法。可以实现吗？ 一头雾水。。

user: user-4
content: 这样的话，你需要用脚本来做，参考lua脚本与c的相互调用。  引用 4 楼 vampiresme 的回复:可能我想的不对， 我想把函数名的映射存储在配置文件中，将hello bye函数分别放在一个动态链接库中。这样增加新的函数时，只需要修改配置文件，增加动态库，不需要停止主程序的运行。

user: user-0
content: 引用 3 楼 u011779875 的回复:函数名 是写在程序里面的 你要改变函数名的话  必须重新编译了  你要想一次编译 通过配置文件改函数名是不科学的 如果你想通过命令h b调用函数hello bye 只能在你的程序里加逻辑判断 调用相应函数  那样来说的话 你的配置文件就没有了 你可以在程序里面进行提示 如何操作通过一个字母  你也可以通过读txt文件 来操作使用何种操作去代表执行何种函数 谢谢你 我想做到的是main函数中调用一个统一的方法test();配置文件中可能会新加一些key/value，这样，在主程序中是判断输入，然后查配置文件，然后通过调用统一的方法test(),自动映射到配对的函数 有点类似于动态绑定。。

user: user-0
content: 可能我想的不对， 我想把函数名的映射存储在配置文件中，将hello bye函数分别放在一个动态链接库中。这样增加新的函数时，只需要修改配置文件，增加动态库，不需要停止主程序的运行。

user: user-5
content: 函数名 是写在程序里面的 你要改变函数名的话  必须重新编译了  你要想一次编译 通过配置文件改函数名是不科学的 如果你想通过命令h b调用函数hello bye 只能在你的程序里加逻辑判断 调用相应函数  那样来说的话 你的配置文件就没有了 你可以在程序里面进行提示 如何操作通过一个字母  你也可以通过读txt文件 来操作使用何种操作去代表执行何种函数

user: user-0
content: 比如main函数中输入的是b，然后去配置文件读出来'b'的value="bye"，返回类型是字符串。 怎么把这个bye转化成函数bye()进行调用

user: user-4
content: for(;;) {     if(strcmp(name, "hello") == 0)         hello();     else if(strcmp(name, "bye") == 0)         bye(); }   引用 楼主 vampiresme 的回复: void hello() { 	printf("hello\n"); } void bye() { 	printf("goodbye\n"); }  函数名是存在配置文件中的， 如下： h=hello b=bye 想要在main()中通过输入一个字母,并读取配置文件，来识别字母对应的函数名，并调用相应的函数。 想到可能会用到这个： typedef void (*msg)(void) 但是具体不知道怎么写。