首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

各位,如何可以让一个函数执行一个不知名的函数

2012-04-10 
各位,怎么可以让一个函数执行一个不知名的函数.如果我的有一个函数是要执行一个由输入者输入一段文字所要

各位,怎么可以让一个函数执行一个不知名的函数.
如果我的有一个函数是要执行一个由输入者输入一段文字所要确定的函数,请问我这个函数应该如何设计.
即>我有一个函数如下:
void fun()
{
  //1.用户输入一个字符串存到name里,其中name是下面几个函数的函数名
  //2.执行由name所要确定的函数
}

void fun1(){}
void fun2(){}
void fun3(){}
void fun4(){}
void fun5(){}

[解决办法]
使用函数指针
[解决办法]
楼主问题再清楚一点好吗/没有看明白。
[解决办法]
void (*p)();


if(...){
p = fun1;
}else if(...){
p = fun2;
}
.....
....
...
[解决办法]
参考这个:http://topic.csdn.net/u/20090726/08/1118529b-3d78-4489-8392-bdd9659bac66.html
[解决办法]
执行函数:
p();
[解决办法]
if(name == "fun1")//字符串相等判断

fun1();
else if (name == "fun2")
fun2();
.......
函数指针都不需要
[解决办法]

C/C++ code
if (strcmp(name, fun1) == 0){    fun1(){}}else if (strcmp(name, fun2) == 0){    fun2(){}}....else (strcmp(name, fun5) == 0){    fun5(){}}
[解决办法]
刚刚看到楼主的说明,再想想啊。
[解决办法]
如果这一组函数原型相同的话,比如说,都是 void(*)(void) 的形式,则可以使用函数指针数组,这问题就简单了,你输入什么字串,去和一个事先准备好的字串数组去比对,返回那个匹配好的下标,而由于字串数组与函数指针数组是一一对应的,那么获得下标后直接去调用函数就可以了。

如果这一组函数的原型不同,比如有的是 void(*)(int),有的是 int(*)(int,int)之类的,那么……只好switch/case 了……
[解决办法]
探讨
因为我要执行的函数有成千个,所以楼上这种做法是很不好的.

[解决办法]
函数原型是一致的吗?

Windows的话,可以试试把成千个函数放在一个动态库dll中,GetProcAddress传入函数名就可以得到函数地址~
[解决办法]
探讨
如果这一组函数原型相同的话,比如说,都是 void(*)(void) 的形式,则可以使用函数指针数组,这问题就简单了,你输入什么字串,去和一个事先准备好的字串数组去比对,返回那个匹配好的下标,而由于字串数组与函数指针数组是一一对应的,那么获得下标后直接去调用函数就可以了。

如果这一组函数的原型不同,比如有的是 void(*)(int),有的是 int(*)(int,int)之类的,那么……只好switch/case 了……

[解决办法]
探讨
如果我的有一个函数是要执行一个由输入者输入一段文字所要确定的函数,请问我这个函数应该如何设计.
即>我有一个函数如下:
void fun()
{
    //1.用户输入一个字符串存到name里,其中name是下面几个函数的函数名
    //2.执行由name所要确定的函数
}

void fun1(){}
void fun2(){}
void fun3(){}
void fun4(){}
void fun5(){}

[解决办法]
凑活一下
C/C++ code
#include <stdio.h>#include <string.h>void fun1(void){   printf("Fun1\n");}void fun2(void){   printf("Fun2\n");}void fun3(void){   printf("Fun3\n");}void fun4(void){   printf("Fun4\n");}void fun5(void){   printf("Fun5\n");}int main(int argc, char *argv[]) {   typedef void (*FunPtr)(void);   int i;   char *str[] = { "fun1", "fun2", "fun3", "fun4", "fun5" };   FunPtr f[] = { &fun1, &fun2, &fun3, &fun4, &fun5 };   do   {          int k, t;      char FuncName[10];      printf("Please input Function name: (exit to terminate)");      scanf("%s", FuncName);      i = strcmp("exit", FuncName);      if (!i) /*Input exit string to exit*/         break;      t = sizeof(str) / sizeof(str[0]);      for (k = 0; k < t; ++k)      {         if (!strcmp(str[k], FuncName))         {            f[k]();            break;         }      }      if (k == t)      {         printf("Function Name Error!\n");      }   } while (i);   printf("Bye Bye!\n");   return 0;} 


[解决办法]
11楼和12楼的方法应该就可以了啊!
要是函数太多的话就用12楼的方法吧,在执行核心程序之前,可以先遍历一下文件,初始化map。
[解决办法]
可以使用 函数指针数组

要看函数簇的形式是否相同,
如果不同就有些麻烦,尤其是形参个数不同时
不过类型不同也不是无解,还有 void * 这个万能类型可以使用

如果形式相同,可以直接在主调函数的形参中加函数指针
如果不同,则需要利用表驱动法去定位这个指针了
[解决办法]
出勤来了。

C/C++ code
#define YOUR_COUNT   5char *comm[YOUR_COUNT]={ "creat" , "open" , "dir" , "help", "quit" };void justComm(char *inp){int i;for(i=0;i<YOUR_COUNT&&stricmp(inp, comm[i]);i++);if(i<YOUR_COUNT)switch(i){                case 0 : fun1(); break; // creat                case 1 : fun2(); break; // open                case 2 : fun3(); break; // dir                case 3 : fun4(); break; // help                case 4 : fun5(); break; // quit                case 5 : puts("bad command, Enter \"help\" to more");                }} 

热点排行