Как вызвать функцию, которая имеет указатель на функцию в качестве аргумента в C? - PullRequest
0 голосов
/ 01 июня 2019

Я пишу программу, которая находит решения уравнения с использованием метода Ньютона.Мне нужно использовать указатели на функции, чтобы при необходимости можно было быстро заменить уравнение.

Указатели на функции работают до тех пор, пока мне просто нужно значение, возвращаемое функцией, но не когда я пытаюсь вызвать функцию, которая имеетуказатели на функции в качестве аргументов внутри другой функции.

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

Я получаю ошибки в строках 31, 47, 50 в (*funct).

Ошибка: аргумент типа "double" внесовместим с параметром типа "double (*) (double x, data data)".

1 Ответ

1 голос
/ 01 июня 2019

Вот вам пример:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...