我正在处理一些遗留的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 *))
我的问题是derivs
中int_de
的使用如何工作?无需任何参数即可调用它。
答案 0 :(得分:3)
答案是尚未调用函数derivs
-它的地址被传递给int_de
,后者可能会使用其地址稍后。例如参见https://www.geeksforgeeks.org/function-pointer-in-c/
这可能有用的示例。在以下代码中,我们根据derivs
中的哪一个重复使用函数accumulate
中的逻辑来获取整数列表的sum
或product
和add
传入。这样,我们不必两次写出循环逻辑,这应该有助于防止任何复制粘贴错误。
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));
}