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

怎么编写包含几万个函数的程序

2012-08-01 
如何编写包含几万个函数的程序?工作中,我需要使用函数指针数组,函数有几万个,示例程序大致如下:C/C++ code

如何编写包含几万个函数的程序?
工作中,我需要使用函数指针数组,函数有几万个,
示例程序大致如下:

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行的

热点排行
Bad Request.