如何解决编写一个函数,将指向任何函数的指针作为参数
我在 C 语言中遇到了指针问题。我必须编写一个程序,该程序将使用函数和指针对一个数字(sqrt、sin、exp)进行 3 次运算。我已经做到了,但是我在编写一个函数时遇到了问题,该函数将指向上述任何函数的指针+一个浮点数作为参数,返回相应计算的结果。 在主函数中,我附加了没有这个函数的工作代码。我不知道如何编写这个函数,我在这段代码中写了我的尝试。我在这里附上我写的代码:
#include <stdio.h>
#include <math.h>
double square(double *);
double sinus(double *);
double exponential(double *);
void count(*square,double result);
double number,square_result,sinus_result,exponential_result;
int main()
{
printf("Give number: ");
scanf("%lf",&number);
square_result = square(&number);
sinus_result = sinus(&number);
exponential_result = exponential(&number);
printf("%lf\n",square_result);
printf("%lf\n",sinus_result);
printf("%lf",exponential_result);
}
double square(double *x)
{
double square_result;
square_result = sqrt(*x);
return square_result;
}
double sinus(double *x)
{
double sinus_result;
sinus_result = sin(*x);
return sinus_result;
}
double exponential(double *x)
{
double exponential_result;
exponential_result = exp(*x);
return exponential_result;
}
void count(*square,double result)
{
result = square(&number);
}
解决方法
我创建了一个函数 call_func
以函数上的指针作为参数和一个 double*
,如下所示:
//arguments are a pointer to any functions taking argument double* and a double* number
double call_func(double (*MyFunction)(double* arg),double* number)
{
return (MyFunction)(number);
}
// 一个小的编辑,恕我直言,您不需要通过指针传递 number
应该这样调用:
square_result = call_func(square,number);
sinus_result = call_func(sinus,number);
exponential_result = call_func(exponential,number);
在这里,集成在您的代码中:
// here is my function that takes a function pointer as an argument
double call_func(double (*MyFunction)(double* arg),double number);
int main()
{
printf("Give number: ");
scanf("%lf",&number);
square_result = square(&number);
sinus_result = sinus(&number);
exponential_result = exponential(&number);
printf("%lf\n",square_result);
printf("%lf\n",sinus_result);
printf("%lf",exponential_result);
// call of my general function
printf("\n********************************\n");
printf("\n\nUSAGE OF FUNCTION POINTER \n");
double square_result2 = 0.0;
double sinus_result2 = 0.0;
double exponential_result2 =0.0;
square_result2 = call_func(square,&number);
sinus_result2 = call_func(sinus,&number);
exponential_result2 = call_func(exponential,&number);
printf("%lf\n",square_result2);
printf("%lf\n",sinus_result2);
printf("%lf",exponential_result2);
}
//arguments are a pointer to any functions taking argument double and a double number
double call_func(double (*MyFunction)(double* arg),double* number)
{
return (MyFunction)(number);
}
,
对于初学者来说,将函数参数声明为具有指针类型 double *
没有任何意义。
double square(double *);
double sinus(double *);
double exponential(double *);
因为 double
类型的引用对象在函数中没有改变。
声明函数如
double square(double );
double sinus(double );
double exponential(double );
他们会被称为
square_result = square( number);
sinus_result = sinus( number);
exponential_result = exponential(number);
所有这些函数都有类型
double( double)
或者指向这样一个函数的指针的类型看起来像
double ( * )( double )
所以你可以声明所需的函数,例如
double f( double calc( double ),double value );
或等效
double f( double ( * calc )( double ),double value );
您可以使用自己的名字代替 f 和 calc。
该函数可以像这样调用
double result = f( square,number );
在函数内你可以写
double f( double ( * calc )( double ),double value )
{
return calc( value );
}
你可以声明一个指向函数的指针数组
double ( *fp[] )( double ) = { square,sinus,exponential };
size_t N = sizeof( fp ) / sizeof( *fp );
并在循环中调用函数
for ( size_t i = 0; i < N; i++ _
{
double result = f( fp[i],number );
//...
}
作出此声明
double ( *fp[] )( double ) = { square,exponential };
更简单的是,您可以引入一个 typedef 名称。例如
typedef double Func( double );
在这种情况下,数组声明看起来像
Func * fp[] = { square,exponential };
,
参考您的代码,使用 EITHER (1) 指针或 (2) 返回值。
(1) 表示使用原变量(原地址),可以在子程序中更改。那么什么都不需要返回。
(2) 给子程序提供一个变量值,子程序返回结果。那么子程序的输入参数就不需要是指针了。
那么 (1) 是(注意输入值被结果值替换了)
void square_root(double *x)
{
*x = sqrt(*x);
}
或 (1) 如果您不希望输入被结果替换
void square_root(double a,double *x)
{
*x = sqrt(a);
}
或 (2) 是
double square_root(double a)
{
double r;
r = sqrt(a);
return r;
}
或 (2) 更短的方式是
double square_root(double a)
{
return sqrt(a);
}
评论:通常,在这里我会选择第一个 (2) 版本。否则,如果您想使用指针,例如因为无论如何你都想从子程序中得到几个值,那么就去(1)的第二个版本。
评论 2:指针非常有用。有时指针是(几乎)唯一的解决方案。您需要熟悉使用指针。如果不是,您宁愿引入潜在风险,如果有些事情不太对劲。您需要了解为什么会这样。
COMMENT 3:关于函数指针。我建议,首先了解数据指针的概念。并暂时跳过指向函数的指针,除非您在学校需要它。那么以下可能是一个很好的参考: How do function pointers in C work?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。