我正在编写一个程序,该程序使用牛顿法找到方程的解。我需要使用函数指针,以便可以根据需要快速替换方程式。
只要我只需要函数返回的值,函数指针就可以工作,但是当我尝试调用将函数指针作为另一个函数中的参数的函数时,函数指针不起作用。
#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", ¶meters.theta);
printf("M = ");
scanf("%lf", ¶meters.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行出现错误。
错误:“ double”类型的参数与“ double(*)(double x,数据参数)”类型的参数不兼容。
答案 0 :(得分:1)
这里有个例子:
#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;
}