2013-06-12 70 views
0

这是我第一次使用指针函数。指针函数c语言基础

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

函数essay会将参数相乘,然后将函数i的值作为参数返回给产品。

这听起来很复杂,但它确实很简单。 例子:

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

这是我的代码...由于某种原因,它没有让我的指针发送到功能的罪。说没有重载函数罪的实例符合参数列表,但这正是我看到我的老师做的事情......我想。

#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(); 
} 
+0

为什么不像这个'#define _USE_MATH_DEFINES'和代码中使用'M_PI'来定义您的PI(x)值?只是一个旁注。 – Kyslik

+2

您还正在使用C++编译器编译C代码。不要这样做! (和'main()'应该返回'int')。 –

+0

'essay'的第二个参数应该是'int',而不是'double'。如果使用3.5作为要处理的参数数目来调用,您将要做什么?另外,当你按照答案中的讨论修正了函数指针参数的类型时,你可以写'result = pfunc(product);'或'result =(* pfunc)(product);'来评估函数。你需要'*',因为你的函数定义中多余的'*'。 –

回答

3

这是错误的

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

在这里,我们传递一个函数作为返回一个指针,以加倍的参数,是没有意义的,应该是:

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

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

+0

不应该是**吗? – Kyslik

+0

它的工作!感谢DGomez。 –

+0

@Kyslik,不,它不应该。 –

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)); 
} 
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)); 
}