微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编写一个函数,将指向任何函数的指针作为参数

如何解决编写一个函数,将指向任何函数的指针作为参数

我在 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 举报,一经查实,本站将立刻删除。