double randNormal(double (*fun)(double, double, double), double xmin, double xmax, double sigma, double mju)
{
static double (*Fun)(double, double, double) = NULL, YMin, YMax;
static bool First = true;
if (First)
{
First = false;
srand((unsigned) time(NULL));
}
if (fun != Fun)
{
Fun = fun;
YMin = 0, YMax = Fun(xmin, sigma, mju);
for (int iX = 1; iX < 10000; iX++)
{
double X = xmin + (xmax - xmin) * iX / 10000;
double Y = Fun(X, sigma, mju);
YMax = Y > YMax ? Y : YMax;
}
}
double X = xmin + (xmax - xmin) * rand() / RAND_MAX;
double Y = YMin + (YMax - YMin) * rand() / RAND_MAX;
return Y < fun(X, sigma, mju) ? X : randomNormal(Fun, xmin, xmax, sigma, mju);
}
我对C ++很陌生,我正在努力理解上面的代码。在定义函数(*fun)(double, double, double)
时,randNormal
的作用是什么?此外,以static double
开头的第二行完成了什么?我很感激你的帮助!
答案 0 :(得分:5)
这是一个函数指针。在这种情况下,函数返回一个double并将3个双精度作为参数。 Fun
以相同的方式声明,稍后调用,使用3个双精度作为参数)
static double
行声明一个函数指针Fun,就像有趣和两个double值一样。 static
这里表示保留这些值,并且在下次调用该函数时仍然可用。
编辑: 要阅读有关函数指针的更多信息,请参阅此处:How do function pointers in C work?
答案 1 :(得分:3)
double (*fun)(double, double, double)
是一个指向函数的指针,该函数将3个双精度作为参数并返回double。例如,当你有
double example(double a, double b, double c){
return a+b+c;
}
您可以通过
传递此功能double x = randNormal(example,...);
static Fun
在函数调用之间保持其值。这就是为什么在检查函数时,如果Fun != fun
,并且只有true
这个参数被分配给static
变量。但是,为了更好地解释,我必须知道这个函数的逻辑是什么。
PS:typedef
在使用函数指针时可以提供很多帮助。使用
typedef (double)(*FUNCTION_TYPE)(double,double,double);
或更一般地说,
typedef (return_type)(*FUNCTION_TYPE)(parameter_type);
可以帮助使声明更容易编写和可能阅读。
答案 2 :(得分:0)
函数randNormal的第一个参数“double(* fun)(double,double,double)”是function pointer。下面的示例将向您解释某个级别的函数指针的用法。代码注释将详细解释。
#include <iostream>
//Actual function 1
double fnGetMax(double a, double b, double c) {
//return someMathLibrary::StaticMaxOf(a, b ,c);
return a-b-c;
}
//Actual function 2
double fnGetMin(double a, double b, double c) {
//return someMathLibrary::StaticMinOf(a, b ,c);
return a+b+c;
}
//Actual function 3
//which takes the "function pointer" as argument of the actual functions like 1 & 2
double randNormal(double (*fun)(double, double, double), double xmin, double xmax, double sigma, double mju) {
static double (*Fun)(double, double, double) = NULL, YMin, YMax;
static bool First = true;
if (First) {
First = false;
srand((unsigned) time(NULL));
}
if (fun != Fun) {
Fun = fun;
//calling actual function 1 or 2
YMin = 0, YMax = Fun(xmin, sigma, mju);
} else {
//calling actual function 1 or 2
YMax = 0, YMin = Fun(xmax, sigma, mju);
}
return YMin + YMax;
}
int main(int argc, char** argv) {
//Creating function pointer for the actual function 1
double (*funMax_ptr)(double, double, double) = &fnGetMax;
//Creating function pointer for the actual function 2
double (*funMin_ptr)(double, double, double) = &fnGetMin;
//Passing the function pointer to the randNormal (actual function 3)
std::cout << randNormal(funMax_ptr,1.0,2.0,3.0,4.0) << std::endl;
std::cout << randNormal(funMin_ptr,1.0,2.0,3.0,4.0) << std::endl;
return 0;
}
<强>输出:强>
-6
8