如何在 C 中调用具有函数指针作为参数的函数?

How to call a function that has a function pointer as an argument in C?

我正在编写一个程序,使用牛顿法求解方程。我需要使用函数指针,以便在需要时可以快速替换方程式。

只要我只需要函数返回的值,函数指针就可以工作,但当我尝试调用一个将函数指针作为另一个函数内部参数的函数时,函数指针就不会工作。

#define _CRT_SECURE_NO_WARNINGS
#define M_PI 3.14159265358979323846
#define N 2
#include <stdio.h>
#include <math.h>

struct data{
    double theta;
    double gamma;
    double M;
    double epsilon;
    double dx;
};

double funct(double, data);
double derivative(double, data, double(*f)(double, data));
double MST(double, data, double(*f)(double, data));

void main(){
    double results[N];
    data parameters;
    parameters.gamma = 1.4, parameters.epsilon = 0.001;
    printf("Podaj parametry:\nTheta = ");
    scanf("%lf", &parameters.theta);
    printf("M = ");
    scanf("%lf", &parameters.M);

    int index = 0;
    for (int x = 0; x < M_PI / 2.; x++){
        if (funct(x, parameters)*funct(x + 1, parameters) < 0){
            results[index] = MST(x, parameters, (*funct)(x, parameters));
            index++;
        }
    }
}

double funct(double sigma, data parameters){
    return 2. / ((parameters.gamma + 1)*parameters.M*parameters.M*sin(sigma)*sin(sigma)) - tan(sigma - parameters.theta) / tan(sigma) + (parameters.gamma - 1) / (parameters.gamma + 1);
}

double derivative(double x, data parameters, double (*f)(double x, data parameters)){
    double dx = 0.0001;
    return (f(x + dx, parameters) - f(x, parameters)) / dx;
}

double MST(double sigma_0, data parameters, double(*funct)(double sigma, data parameters)){
    double sigma_1 = sigma_0 - funct(sigma_0, parameters) / derivative(sigma_0, parameters, (*funct)(sigma_0, parameters));
    while (fabs(sigma_1 - sigma_0) < parameters.epsilon){
        sigma_0 = sigma_1;
        sigma_1 = sigma_0 - funct(sigma_0, parameters) / derivative(sigma_0, parameters, (*funct)(sigma_0, parameters));
    }
    return sigma_1;
}

我在 (*funct) 的第 31、47、50 行中遇到错误。

Error: argument of type "double" in incompatible with parameter of type "double (*)(double x, data parameters)".

这里有一个例子:

#include <stdio.h>

int function1(int x)
{
    return x + x;
}

int function2(int x)
{
    return x * x;
}

int function3(int x)
{
    int result = 1;
    for(int i = 1; i <= x; i++)
        result *= i;
    return result;
}

int ffunction(int (*f)(int), int arg)
{
    return f(arg);
}

int main()
{
    printf("Function1 call %d\n", ffunction(function1, 5));
    printf("Function2 call %d\n", ffunction(function2, 5));
    printf("Function3 call %d\n", ffunction(function3, 5));

    return 0;
}