C使用函数而不调用其参数

时间:2019-06-21 00:26:42

标签: c

我正在处理一些遗留的C代码,这很麻烦。这是我所拥有的:

在头文件中声明:

int derivs(double,const double *,double *,void *);

然后,具有相同名称的.c文件中的另一个声明:

int derivs(double,const double *,double *,void *);

然后定义函数(在同一文件中):

int derivs(double t, const double y[], double dydN[], void * params)
{
     int i;

    if(y[2]>=1.0)
    {
        for(i=0;i<NEQS;i++)
        {
            dydN[i] = 0.0;
        }
    }
    else
    {
        if(y[2] > VERYSMALLNUM)/*Here for numerical issues in
                        sqrt()*/
        {
            dydN[0]= - sqrt(y[2]/FOURPI); //d phi/ d N eq. (17)
        }
        else
        {
            dydN[0] = 0.0;
        }
        dydN[1] = y[1]*y[2]; // dH / dN = eps * H
        dydN[2] = y[2]*(y[3]+2.0*y[2]); // d epsilon / dN
        dydN[3] = 2.0*y[4]-5.0*y[2]*y[3]-12.0*y[2]*y[2];

        for(i=4;i<NEQS-1;i++)
        {
            dydN[i] = (0.5*(i-3)*y[3]+(i-4)*y[2])*y[i]+y[i+1];
        }
        dydN[NEQS-1] = (0.5*(NEQS-4)*y[3]+(NEQS-5)*y[2])*y[NEQS-1];

    }
    return GSL_SUCCESS;
}

,然后在同一文件的另一个函数中是以下行:

z=int_de(y,Nstart,Nend,&kount,kmax,yp,xp,NEQS,derivs);

即派生仅按名称调用,不带任何参数。函数int_de声明如下:

int int_de (gsl_vector *y, double N, double Nend, int *kount, int kmax,
gsl_matrix *ypp, gsl_vector *xpp, int NEQS, int (*derivs)(double,const
double *, double *,void *))

我的问题是derivsint_de的使用如何工作?无需任何参数即可调用它。

1 个答案:

答案 0 :(得分:3)

答案是尚未调用函数derivs-它的地址被传递给int_de,后者可能会使用其地址稍后。例如参见https://www.geeksforgeeks.org/function-pointer-in-c/

这可能有用的示例。在以下代码中,我们根据derivs中的哪一个重复使用函数accumulate中的逻辑来获取整数列表的sumproductadd传入。这样,我们不必两次写出循环逻辑,这应该有助于防止任何复制粘贴错误。

multiply

编译并运行它,我得到输出:

#include <stdio.h>

int add(int x, int y)
{
    return x + y;
}

int multiply(int x, int y)
{
    return x * y;
}

// We can pass any function with matching signature in as binary_operation, and
// accumulate will use it!
int accumulate(int starting_value, int length, int* values, int binary_operation(int, int))
{
    int result = starting_value;
    for (int index = 0; index < length; index++)
    {
        result = binary_operation(result, values[index]);
    }
    return result;
}

int sum(int length, int* values)
{
    return accumulate(0, length, values, add);
}

int product(int length, int* values)
{
    return accumulate(1, length, values, multiply);
}

int main(int argc, char** argv)
{
    int values[5] = { 1, 2, 3, 4, 5 };
    printf("sum of first three = %d\n", sum(3, values));
    printf("product of all five = %d\n", product(5, values));
}