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

急有个c函数的语法有关问题

2012-03-02 
急!!!有个c函数的语法问题两个函数的原型如下:doubleintegrandfunc(doubleeta,doublesita,doubleu,doublef

急!!!有个c函数的语法问题
两个函数的原型如下:  
double   integrandfunc(double   eta,double   sita,double   u,double   f0,double   q);  
double   qromb(double   (*func)(double   a,double   b   ,double   c   ,double   d,double   e),double   a,double   b)   ;

要实现下面这句的语法该怎么写才可以?  
m   =   qromb(integrandfunc,sitaL,   sitaR);
说明:其中qromb是个求积分的(龙贝格)函数,integrandfunc是被积函数(其中的eta,u,f0,q都是用户输入的变量),sitaL,和sitaR是积分上下限,积分是对sita进行的.

跪求高人指点!小弟在这里先谢过了:)


[解决办法]
like this

double integrandfunc(double eta,double sita,double u,double f0,double q)
{return 1.0;}
double integrandfunc1(double eta,double sita,double u,double f0,double q)
{return 2.0;}
double qromb(double (*func)(double a,double b ,double c ,double d,double e),double a,double b)
{
return (*func)(a,b,3.0,4.0,5.0)+a+b;
}

cout < <qromb(integrandfunc,1.0,2.0) < <endl;
cout < <qromb(integrandfunc1,1.0,2.0) < <endl;

the result is :
4
5
[解决办法]
两个函数的原型如下:
double integrandfunc(double eta,double sita,double u,double f0,double q);
double qromb(double (*func)(double a,double b ,double c ,double d,double e),double a,double b) ;

要实现下面这句的语法该怎么写才可以?
m = qromb(integrandfunc,sitaL, sitaR);
说明:其中qromb是个求积分的(龙贝格)函数,integrandfunc是被积函数(其中的eta,u,f0,q都是用户输入的变量),sitaL,和sitaR是积分上下限,积分是对sita进行的.
=======================

1. 如果不能修改qromb的定义, 则用全局变量传递eta, u, fo, q给integrandfunc:
在integrandfunc中使用全局变量:

double integrandfunc(double eta,double sita,double u,double f0,double q)
{
eta = gEta;
u = gU;
f0 = gFo;
q = gQ;
........................
}


double gEta, gU, gFo, gQ;
..........
接收用户输入的 gEta, gU, gFo, gQ;
.....
然后直接调用:
m = qromb(integrandfunc,sitaL, sitaR);

2. 如果你可以修改integrandfunc和qromb定义, 建议这样做更好:
typedef double (*IntegrFunc)(double x, void* funcParam);
double qromb(IntegrFunc, void* funcParam, double a, double b);
这样qromb可以用来对IntegrFunc型的函数进行积分:
double qromb(IntegrFunc, void* funcParm, double a, double b)
{
double fa = IntegrFunc(a, funcParm);
double fb = IntegrFunc(b, funcParm);

double x;
double fx = IntegrFunc(x, funcParm);


.............................
}


现在定义一个结构:

typedef struct _FuncParm
{
double eta;
double u;
double fo;
double q;
} FuncParam;

integrandfunc改为:
double integrandfunc(double sita, void* funcParam)
{
double eta = (FuncParam)funcParam-> eta;
double u = (FuncParam)funcParam-> u;
double fo =(FuncParam)funcParam-> fo;
double q = (FuncParam)funcParam-> q;

......
}

在调用qromb的函数中如下:
void CallQromb()
{
........
接受用户输入的eta, u, fo, q;
FuncParam param;
param.eta = eta;
param.u = u;
param.fo = fo;
param. q = q;
.........
调用qromb:
double m = qromb(integrandfunc, &param, a, b)
......
}

热点排行