使用哈希算法将数字解析为函数指针:
这也算是最简单的,不会带有地址冲突的哈希了,哈希函数可以描述为:
func = arr[index].func
index为输入,根据输入的index,找到其对应的函数指针返回
这种架构虽然简单,但是在做测试时还是非常有用的
比如一种测试有几十项,我可以使用这种架构来实现自动轮巡测试,或者手动交互时输入一个Index,即可以去调用对应的测试函数
另外根据这个代码,还可以学习到函数指针的定义和使用:
定义:typedef int (*FuncPtr)(char *str);
使用:
FuncPtr MainPtr;
char *str = "test string!";
MainPtr = hashFunc(1);
MainPtr(str);
源码如下:
root@ubuntu:/mnt/shared/appbox/hashfun# cat hashfun.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef struct
{
int index;
int (*func) (char *str);
}HashSt;
typedef int (*FuncPtr)(char *str);
int func0(char *str);
int func1(char *str);
HashSt HashStArr[] = {
{0, func0},
{1, func1},
};
int func0(char *str)
{
printf("func1, str:%s!\n", str);
return 0;
}
int func1(char *str)
{
printf("func2, str:%s!\n", str);
return 0;
}
/*
* hash function: func(index) = HashStArr[index].func
*/
FuncPtr hashFunc(int index)
{
return HashStArr[index].func;
}
int main(int argc, char *argv[])
{
FuncPtr MainPtr;
char *str = "test string!";
MainPtr = hashFunc(1);
MainPtr(str);
MainPtr = hashFunc(1);
MainPtr(str);
return 0;
}
root@ubuntu:/mnt/shared/appbox/hashfun# 输出如下:
root@ubuntu:/mnt/shared/appbox/hashfun# ./hashfun func2, str:test string!! func2, str:test string!!
main函数可以优化为:
int main(int argc, char *argv[])
{
FuncPtr MainPtr;
char *str = "test string!";
int i;
for(i=0; i<2; i++)
{
MainPtr = hashFunc(i);
MainPtr(str);
}
return 0;
}输入同样为:
root@ubuntu:/mnt/shared/appbox/hashfun# ./hashfun func1, str:test string!! func2, str:test string!!
原文地址:http://blog.csdn.net/xiangpingli/article/details/42113243