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

hq5038 2007-05-16 05:34:52
两个函数的原型如下:
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进行的.

跪求高人指点!小弟在这里先谢过了:)
...全文
221 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hq5038 2007-05-17
  • 打赏
  • 举报
回复
lightnut,真是太感谢你啦,我按你的建议改了程序,现在虽然可以运行,不过还是出不了结果,郁闷啊:(
lightnut 2007-05-16
  • 打赏
  • 举报
回复
更正:
double qromb(IntegrFunc f, void* funcParm, double a, double b)
{
double fa = f(a, funcParm);
double fb = f(b, funcParm);

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


.............................
}
lightnut 2007-05-16
  • 打赏
  • 举报
回复
两个函数的原型如下:
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, ¶m, a, b)
......
}
spofmy 2007-05-16
  • 打赏
  • 举报
回复
函数原型以及你的说明不是说得很清楚的吗?
expter 2007-05-16
  • 打赏
  • 举报
回复
...
pxxx123 2007-05-16
  • 打赏
  • 举报
回复
the essencial is use fuction point as a param
pxxx123 2007-05-16
  • 打赏
  • 举报
回复
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

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧