了解以下C ++函数定义

时间:2016-02-02 19:49:12

标签: c++

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开头的第二行完成了什么?我很感激你的帮助!

3 个答案:

答案 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