0

这是我第一次使用函数指针。

我想做的是创建一个名为essay的函数,它获取指向另一个函数的指针,一个整数num,然后num加倍。

函数文章,将参数相乘,然后将我作为参数收到的函数的值与乘积返回。

这听起来很复杂,但实际上非常简单。例子:

essay(sin,2,pi,1/2) will return the value of sin(pi/2)

这是我的代码...由于某种原因,它不允许我将指针发送到函数 sin。说没有重载函数 sin 的实例与参数列表匹配,但这正是我看到我的老师这样做的方式......我想。

#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
#include <math.h>
double (*pfunc)(double);
double essay(double* pfunc(double),double num, ... )
{
    int i;
    double product=1,result;
    va_list arguments;
    va_start(arguments,num);
    for(i=0;i<num;i++)
        product*=va_arg(arguments,double);
    va_end(arguments);
    result=*(pfunc(product));
    return result;
}
void main()
{
    double x,y;
    x=3.14159265358979323846;
    y=0.5;
    printf("%lf",essay(sin,2,x,y));
    getch();
}
4

3 回答 3

3

这是错误的

double essay(double* pfunc(double),double num, ... )

在这里,您将一个函数作为参数传递,该函数返回一个指向 double 的指针,这没有意义,应该是:

 double essay(double (*pfunc)(double),double num, ... )

在这里,您传递一个指向函数的指针,该函数返回一个 double 并接收一个 double 作为参数

于 2013-06-12T20:27:40.917 回答
1
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
// removed extra var
double essay(double (*pfunc)(double), double num, ...) // added parens
{
    int i;
    double product = 1, result;
    va_list arguments;
    va_start(arguments, num);
    for (i = 0; i < num; i++)
    product *= va_arg(arguments, double);
    va_end(arguments);
    result = pfunc(product); // removed extra parens
    return result;
}

void main()
{
    double x, y;
    x = 3.14159265358979323846;
    y = 0.5;
    printf("%lf", essay(sin, 2, x, y));
}
于 2013-06-12T20:28:30.457 回答
0

这就是我要做的,假设 C99 编译器在for循环和代码块中的任意点接受变量声明。请注意typedef函数指针类型的使用(MathFunc2将用于接受两个参数的函数等),以及使用int(而不是double)作为参数列表中值的数量。

#include <math.h>
#include <stdarg.h>
#include <stdio.h>

typedef double (*MathFunc1)(double);

static double essay(MathFunc1 function, int num, ...)
{
    double product = 1.0;
    va_list arguments;
    va_start(arguments, num);
    for (int i = 0; i < num; i++)
        product *= va_arg(arguments, double);
    va_end(arguments);
    double result = (*function)(product);
    return result;
}

int main(void)
{
    double x = 3.14159265358979323846;  // M_PI?
    double y = 0.5;
    printf("%f\n", essay(sin, 2, x, y));
}
于 2013-06-12T20:44:09.753 回答