Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编写一个函数,将指向任何函数的指针作为参数_C_Function Pointers_Function Declaration - Fatal编程技术网

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

C 编写一个函数,将指向任何函数的指针作为参数,c,function-pointers,function-declaration,C,Function Pointers,Function Declaration,我在用C语言编写指针。我必须编写一个程序,使用函数和指针对一个数字(sqrt、sin、exp)进行3次运算。我已经这样做了,但是我有一个问题,编写一个函数,该函数以指向上述任何函数的指针+浮点数作为参数,返回相应计算的结果。 在主功能中,我附加了不带此功能的工作代码。我不知道如何编写这个函数,我用这段代码编写了我的try。在此,我附上我编写的代码: #include <stdio.h> #include <math.h> double square(double *);

我在用C语言编写指针。我必须编写一个程序,使用函数和指针对一个数字(sqrt、sin、exp)进行3次运算。我已经这样做了,但是我有一个问题,编写一个函数,该函数以指向上述任何函数的指针+浮点数作为参数,返回相应计算的结果。 在主功能中,我附加了不带此功能的工作代码。我不知道如何编写这个函数,我用这段代码编写了我的try。在此,我附上我编写的代码:

#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);
}
#包括
#包括
双正方形(双*);
双窦(双*);
双指数(双*);
无效计数(*平方,双结果);
双数、平方、正弦、指数;
int main()
{
printf(“给出编号:”);
scanf(“%lf”和编号);
平方_结果=平方(&数字);
窦房结\结果=窦房结和数量;
指数结果=指数(&数字);
printf(“%lf\n”,平方结果);
printf(“%lf\n”,结果);
printf(“%lf”,指数结果);
}
双正方形(双*x)
{
双平方结果;
平方结果=sqrt(*x);
返回平方结果;
}
双窦(双*x)
{
双窦造影结果;
窦房结结果=sin(*x);
返回结果;
}
双指数(双*x)
{
双指数结果;
指数结果=exp(*x);
返回指数结果;
}
无效计数(*平方,双结果)
{
结果=平方(&数字);
}

对于初学者来说,将函数参数声明为指针类型
double*
没有任何意义

double square(double *);
double sinus(double *);
double exponential(double *);
因为函数中未更改类型为
double
的通过引用传递的对象

声明如下函数

double square(double );
double sinus(double );
double exponential(double );
double ( *fp[] )( double ) = { square, sinus, exponential };
size_t N = sizeof( fp ) / sizeof( *fp );
他们将被称为

square_result = square( number);
sinus_result = sinus( number);
exponential_result = exponential(number);
所有这些函数都具有

double( double)
或者指向这样一个函数的指针的类型

double ( * )( double )
Func * fp[] = { square, sinus, exponential };
因此,您可以声明所需的函数,例如

double f( double calc( double ), double value );
double result = f(  square, number );
或同等地

double f( double ( * calc )( double ), double value );
在这里,您可以使用自己的名称,而不是f和calc

函数可以被调用,例如

double f( double calc( double ), double value );
double result = f(  square, number );
在函数中,您可以编写

double f( double ( * calc )( double ), double value )
{
    return calc( value );
}
您可以声明指向函数的指针数组,如

double square(double );
double sinus(double );
double exponential(double );
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 );
    //...
}
更简单的是,可以引入typedef名称。比如说

typedef double Func( double );
在本例中,数组声明如下所示

double ( * )( double )
Func * fp[] = { square, sinus, exponential };

参考您的代码,使用(1)指针或(2)返回值

(1) 表示使用原始变量(原始地址),并且可以在子例程中更改。那就什么都不用还了

(2) 变量值提供给子例程,子例程将返回结果。然后子例程的输入参数不需要是指针

然后(1)是(注意输入值被结果值替换)

或者(1)如果您不希望输入被结果替换

void square_root(double a, double *x)
{
    *x = sqrt(a);
}
或(2)是

或者(2)在较短的时间内

double square_root(double a)
{ 
   return sqrt(a);
}
评论:通常,我会选择第一(2)个版本。否则,如果您想使用指针,例如,因为您想从子例程中获取多个值,那么请使用(1)的第二个版本

注释2:指针可能非常有用。有时指针(几乎)是唯一的解决方案。您需要熟悉指针的使用。如果不是,你宁愿引入一个潜在的风险,如果事情不太正确。你需要知道为什么会这样

注释3:关于指向函数的指针。我建议,首先了解数据指针的概念。现在跳过指向函数的指针,除非你在学校需要它。那么以下内容可能是一个很好的参考:

我创建了一个函数
call_func
将函数上的指针作为参数和一个
双精度*
,如下所示:

//参数是指向任何接受参数double*和double*数字的函数的指针
double call_func(double(*MyFunction)(double*arg),double*number)
{
返回(MyFunction)(编号);
}
//一个小的编辑,不需要通过指针传递
number

这应该这样称呼:

square\u result=调用函数(square,number);
窦房结结果=调用函数(窦房结,编号);
指数结果=调用函数(指数,数字);
在这里,它集成在您的代码中:


//这是我的函数,它将函数指针作为参数
双重调用函数(双重(*MyFunction)(双重*arg),双重编号);
int main()
{
printf(“给出编号:”);
scanf(“%lf”和编号);
平方_结果=平方(&数字);
窦房结\结果=窦房结和数量;
指数结果=指数(&数字);
printf(“%lf\n”,平方结果);
printf(“%lf\n”,结果);
printf(“%lf”,指数结果);
//调用我的一般函数
printf(“\n***************************************\n”);
printf(“\n\n函数指针的用法”);
双平方结果2=0.0;
双窦结果2=0.0;
双指数结果2=0.0;
square\u result2=调用函数(square和number);
窦房结结果2=调用函数(窦房结和号码);
指数结果2=调用函数(指数和数字);
printf(“%lf\n”,平方结果2);
printf(“%lf\n”,结果2);
printf(“%lf”,指数结果2);
}
//参数是指向任何接受参数双精度和双精度数字的函数的指针
double call_func(double(*MyFunction)(double*arg),double*number)
{
返回(MyFunction)(编号);
}

这可能很有帮助:或者最好是
typedef double myfunc\t(double)然后
双f(myfunc\u t*calc,双值)
。谢谢。一个非常小的建议:在函数中使用
double
而不是
double*
可能更好。它将提高可读性并避免使用
调用<代码>必须时按指针传递,可以时按值传递。