0

関数へのポインタを扱うのはこれが初めてです。

私がやろうとしているのは、別の関数へのポインター、整数 num、そして num doubles を取得する、エッセイと呼ばれる関数を作成することです。

関数 エッセイ は、引数を乗算し、引数として受け取った関数 i の値を積で返します。

これは複雑に聞こえますが、実際には非常に単純です。例:

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 に答える