了解以下C++函数定义

Understanding the following C++ function definition

本文关键字:函数 定义 C++ 了解      更新时间:2023-10-16
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++很陌生,我正在努力理解上面的代码。当我们定义函数randNormal时,(*fun)(double, double, double)的作用是什么?此外,从static double开始的第二行完成了什么?我将不胜感激你的帮助!

这是一个

函数指针。在本例中,返回一个双精度值并将 3 个双精度值作为参数的函数。 Fun以相同的方式声明,稍后调用,使用 3 个双精度作为参数)

static double行声明一个函数指针 Fun 就像 fun 一样和两个双精度值。 此处static意味着值将保留,并且在下次调用函数时仍然可用。

编辑:要了解有关函数指针的更多信息,请参阅此处:C 中的函数指针如何工作?

> double (*fun)(double, double, double) 是一个指向函数的指针,该函数将 3 个双精度作为参数并返回一个双精度。例如,当您有

double example(double a, double b, double c){
    return a+b+c;
}

你可以通过以下方式传递这个函数

double x = randNormal(example,...);

static Fun在函数调用之间保持其值。这就是为什么在函数中检查它的原因,如果Fun != fun并且仅当true时才将参数分配给static变量。但是,为了更好地解释,我必须知道这个函数的逻辑是什么。

PS:使用函数指针时,typedef s可以有很大帮助。用

typedef (double)(*FUNCTION_TYPE)(double,double,double); 

或者更一般地说,

typedef (return_type)(*FUNCTION_TYPE)(parameter_type);

可以帮助使声明更易于编写和可能阅读。

函数 randNormal 的第一个参数 "double (*fun)(double, double, double)" 是一个函数指针。下面的示例将向您解释函数指针在某个级别的用法。代码注释将详细解释。

#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