如何编写包含几万个函数的程序?
工作中,我需要使用函数指针数组,函数有几万个,
示例程序大致如下:
- C/C++ code
#include <stdio.h>void f_00_00(void){printf("00 00\n");}void f_00_01(void){printf("00 01\n");}/* 打印部分只是示范,并不是真的要打印,假设一直这样到…… */void f_ff_ff(void){printf("ff ff\n");}typedef void (* f_t)(void);static const f_t arr[65536]={ f_00_00, f_01_00, f_02_00, f_03_00, /* 一直这样直到…… */ f_fe_ff, f_ff_ff};void main(int argc, char* argv[]){ arr[1](); arr[250](); arr[12345](); return 0;}发现问题如下:
这个部分,
- C/C++ code
void f_00_00(void){printf("00 00\n");}void f_00_01(void){printf("00 01\n");}/* 打印部分只是示范,并不是真的要打印,一直这样到 */void f_00_01(void){printf("ff ff\n");}行数很多,编译器提示出错,然后我把它分成几个 .h 文件,再用 #include 包含进来,但是还是出错。
我知道问题是函数太多。
我尝试过,如果几个函数,程序可以正常运行。
但对于几万个函数,如何组织,并且能够保证将其地址放到那个静态常数组中呢?
我做的是嵌入式开发,我需要对那个函数指针数组初始化为那几万个函数。
[解决办法]
总结一下函数有没有规律,适当简化。
[解决办法]
楼主的写法肯定木有问题。
但几万个函数就很夸张了。能不能这样增加一个参数:
typedef void (* f_t)(int i);
根据参数i来区分f_00_00和f_00_01的功能?
这种情况,设计上肯定可以再完善。
[解决办法]
嵌入式系统下用几万个函数太夸张了,设计上应该是有问题的,我觉得你先不要从程序入手,先想想如何简化设计。
[解决办法]
什么编译器?
错误的提示编号是什么?
f_mm_nn
f_01.h ,导出一个 函数指针数组, fptr_01
f_01.c , f_01_00 ~ f_01_FF 的函数实现, static的函数(文件作用域), 把对应的函数地址 存到指针数组 fptr_01
...
一直到 f_ff.h ,
这样,每个 .h 文件,只有一个 fptr_mm, 这个数组的大小是 256, 数组的元素有256个函数指针(这些函数,在对应的 .c文件内实现,用 static 限制为文件作用域。 其实,程序运行的时候,不管是不是static,都是全局的,有指针有地址即可)。
--------
malloc或者直接 65536大小的 函数指针数组aaa。 把数组fptr_01 ~ fptr_FF内的所有函数地址,复制aaa即可。
[解决办法]
几万个功能不相干的函数?还是看看能不能简化吧。编译器提示的错误是什么?
[解决办法]
我觉得重新设计一下,也许就容易了。俺也碰到过几百个函数的情况,总结一下规律,最后压缩成了30个左右。
[解决办法]
仅供参考
- C/C++ code
#include <stdio.h>double A[300][100];double valuex[300];double valuey[300];int i;double fun00(double x,double y) {return x + y ;};double fun01(double x,double y) {return x*x+ 3*y ;};double fun02(double x,double y) {return x + 2*y*x;};//... fun03(double x,double y) {return ...+... ;};//...//... fun98(double x,double y) {return ...+... ;};double fun99(double x,double y) {return x/2+20*y ;};double (*funNN[100])(double,double)={ fun00, fun01, fun02,// fun03,// ...// fun98, fun99,};int main() { double x,y; int f,FN; for (i=0;i<300;i++) { valuex[i]=(double)i; valuey[i]=(double)i; } FN=3; for (i=0;i<300;i++) { x=valuex[i]; y=valuey[i]; for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y); } for (i=0;i<3;i++) { for (f=0;f<FN;f++) printf("%lg ",A[i][f]); printf("\n"); } return 0;}//0 0 0//2 4 3//4 10 10
[解决办法]
搞成多个静态库~
[解决办法]
应该会造成堆栈溢出,我们来计算一下,假设C语言中使用32为指针,共4个字节,那么,全部入栈则一共有4*10000=40000B的栈空间将被分配,合计栈空间将损失40000/1024=39K字节,在加上主函数中的其他变量加载和主函数调用函数时的入栈操作,就算可以运行,如果你的函数中还有那么多变量,就会异常,VC++中默认栈空间为1MB,那么如果你的函数每增加一万个,栈空间就损失39K,函数越多,就越有可能溢出,你的默认栈空间为1MB,只要再多损失39KB的栈空间25次,栈空间就会溢出。另外,我很好奇,你到底是什么项目?要几万个函数太夸张了吧?
[解决办法]
好像听说有些编译器单文件不能超过65535行的