c语言字符串传递函数参数,C:以任意数量的参数作为参数传递函数

长时间浏览器,第一次问问这里.我编写了许多用于执行各种一维数值积分方法的脚本,并将它们编译成一个库.我希望该库能够尽可能灵活地集成它的功能.

这里我举一个例子:一个非常简单的梯形规则示例,我将指针传递给要集成的函数.

// Numerically integrate (*f) from a to b

// using the trapezoidal rule.

double trap(double (*f)(double), double a, double b) {

int N = 10000;

double step = (b-a)/N;

double s = 0;

for (int i=0; i<=N; i++) {

double xi = a + i*step;

if (i == 0 || i == N) { s += (*f)(xi); }

else { s += 2*(*f)(xi); }

}

s *= (b-a)/(2*N);

return s;

}

这适用于只接受一个参数的简单函数.例:

double a = trap(sin,0,1);

但是,有时我可能想要集成具有更多参数的东西,例如二次多项式.在该示例中,系数将在集成之前由用户定义.示例代码:

// arbitrary quadratic polynomial

double quad(double A, double B, double C, double x) {

return (A*pow(x,2) + B*x + C);

}

理想情况下,我可以做这样的事情来集成它:

double b = trap(quad(1,2,3),0,1);

但显然这不起作用.我通过定义一个具有系数作为成员和感兴趣的函数作为成员函数的类来解决这个问题:

class Model {

double A,B,C;

public:

Model() { A = 0; B = 0; C = 0; }

Model(double x, double y, double z) { A = x; B = y; C = z; }

double func(double x) { return (A*pow(x,2)+B*x+C); }

};

但是,然后我的集成函数需要更改为将对象作为输入而不是函数指针:

// Numerically integrate model.func from a to b

// using the trapezoidal rule.

double trap(Model poly, double a, double b) {

int N = 10000;

double step = (b-a)/N;

double s = 0;

for (int i=0; i<=N; i++) {

double xi = a + i*step;

if (i == 0 || i == N) { s += poly.func(xi); }

else { s += 2*poly.func(xi); }

}

s *= (b-a)/(2*N);

return s;

}

这工作正常,但结果库不是非常独立,因为它需要在某处定义类Model.此外,理想情况下,模型应该能够从用户更改为用户,因此我不想在头文件中修复它.我曾尝试使用函数模板和仿函数来使其工作,但它不是非常独立,因为再次,模板应该在头文件中定义(除非你想显式实例化,我不这样做).

总结一下:有什么方法可以让我的集成函数接受具有可变数量输入参数的任意1D函数,同时仍保持足够独立性以便可以将它们编译成独立的库?提前感谢您的建议.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值