如何用C实现函数重载(不是用C++!!)
如何用C实现函数重载(不是用C++!!)
[解决办法]
譬如:用函数Integral(double limita,double limitb,double eps,double (*f)())来实现积分,但由于被积表达式f(x)本身会含有参数且数目不等。如:有时f(x)=a*x+b,有时f(x)=a*sin(b*x)+c*cos(c*x),等等。如果不用函数重载的话,就要编写Integral1(double limita,double limitb,double eps,double (*f)(),double a,double b)和Integral2(double limita,double limitb,double eps,double (*f)(),double a,double b,double c,double d)。非常麻烦,既重复劳动,又不通用。我尝试用Integral(double limita,double limitb,double eps,double (*f)(),double p[])来传递参数,结果失败。如何用函数重载的方法写一个通用的积分函数呢?
=====>
可以这样写:
typedef double (*FUNCTION)(double, void*);
double Integral(double limita, double limitb, double eps, FUNCTION f, void* fparam)
{
// do your intgral task with f
// call f(x, void*)
double f0 = f(0, fparam);
double f2 = f(2, fparam);
..........
.......
}
struct F1Param
{
double a;
double b;
};
struct F2Param
{
double c;
double d;
double e;
double f;
};
double f1(double x, void* param)
{
F1Param* f1para = (F1Param*)param;
//access a, b
double a = f1para-> a;
double b = f1para-> b;
// using a, b
..................
}
double f2(double x, void* param)
{
F2Param* f2para = (F2Param*)param;
//access c, d, e, f
...
double c = f2para-> c;
double d = f2para-> d;
double e = f2para-> e;
double f = f2para-> f;
// using c,d,e,f...
..........
}
void MyUsingIntergate()
{
// integrat f1
F1Param f1para;
f1para.a = 1.0;
f1para.b = 2.0;
double resF1 = Integral(limita, limitb, eps, f1, &f1para);
.....
// integrate f2
F2Param f2para;
f2para.c = 1;
f2para.d = 2;
f2para.e = 3;
f2para.f = 4;
double resF2 = Integral(0,1, 1.e-8, f2, &f2para);
................
}