Ошибка "невозможно преобразовать аргумент" - C (СИ)
Формулировка задачи:
Ошибка 2 error C2664: "double newton(double (__cdecl *)(double),double (__cdecl *)(double),double,double)": невозможно преобразовать аргумент 2 из "double (__cdecl *)(double,double)" в "double (__cdecl *)(double)" c:\users\1\documents\visual studio 2013\projects\consoleapplication107\consoleapplication107\consoleapplication107.cpp 118 1 ConsoleApplication107
Ошибка 3 IntelliSense: аргумент типа "double (*)(double x, double y)" несовместим с параметром типа "double (*)(double)" c:\Users\1\Documents\Visual Studio 2013\Projects\ConsoleApplication107\ConsoleApplication107\ConsoleApplication107.cpp 118 38 ConsoleApplication107
Обе ошибки указывают на эту строку, на "fp1"
Функция для метода Ньютона.
и та самая "fp1"- производная моей функции, для вычисления методом Ньютона
Далее весь код с комментариями(на вяский случай)
printf("%.*f\n", width, newton(f1, fp1, -1.0, 0.0));double newton(double(*f)(double), double(*fp)(double), double a0, double b0)
{
double a, b, x, x0;
a = a0;
b = b0;
x0 = (a + b) / 2;
x = x0 - (f(x0) / fp(x0));
while (xabs(x - x0) > e * 10)
{
x0 = x;
x = x0 - (f(x0) / fp(x0));
}
return x;
}double fp1(double x, double y) //proizvodnaya
{
return 1/(2*pow(cos(x/2),2))-1/(2*(pow(sin(x/2),2)))+1;
}#include <stdio.h>
#include <math.h>
#include <float.h>
double bubu(double s)
{
return s;
}
double get_e()
{
double e = 1.0;
while (bubu(e / 2 + 1) > 1)
e = e / 2;
return e;
}
const double e = DBL_EPSILON;
double f1(double x) //ФУНКЦИЯ 1
{
return tan(x / 2) - (1 / tan(x / 2)) + x;
}
double f2(double x) //ФУНКЦИЯ 2
{
return x*tan(x) - 1 / 3;
}
double f11(double x) //ВЫРАЖАЕМ Х ИЗ Ф-ИИ 1)
{
return 1/tan(x/2)-tan(x/2);
}
double f22(double x) //ВЫРАЖАЕМ Х ИЗ Ф-ИИ 2)
{
return 1 / (3 * tan(x));
}
double fp1(double x, double y) // ПРОИЗВОДНАЯ Ф-ИИ 1)
{
return 1/(2*pow(cos(x/2),2))-1/(2*(pow(sin(x/2),2)))+1;
}
double fp2(double x) // ПРОИЗВОДНАЯ Ф-ИИ 2)
{
return tan(x)+x*(1/pow(cos(x),2));
}
double dichotomy(double(*f)(double), double a0, double b0) // МЕТОД ДИХОТОМИИ
{
double a, b;
a = a0;
b = b0;
while (fabs(a - b) > e * 2)
{
double m = (a + b) / 2;
if (f(a)*f(m) >= 0)
a = (a + b) / 2;
if (f(b)*f(m) >= 0)
b = (a + b) / 2;
}
return (a + b) / 2;
}
double xabs(double x){ // ФУНКЦИЯ МОДУЛЯ(НЕ ИСПОЛЬЗОВАЛАСЬ)
if (x < 0)
return -x;
return x;
}
double iteraciy(double(*f)(double), double a0, double b0) // МЕТОД ИТЕРАЦИИ
{
double a, b, x, x0;
a = a0;
b = b0;
x0 = (a + b) / 2;
x = f(x0);
while (xabs(x - x0) > e * 10)
{
x0 = x;
x = f(x0);
}
return x;
}
double newton(double(*f)(double), double(*fp)(double), double a0, double b0) //МЕТОД НТЮТОНА
{
double a, b, x, x0;
a = a0;
b = b0;
x0 = (a + b) / 2;
x = x0 - (f(x0) / fp(x0));
while (xabs(x - x0) > e * 10)
{
x0 = x;
x = x0 - (f(x0) / fp(x0));
}
return x;
}
int main() // ВЫВОД
{
int width = ceil(-log10(e));
printf("%.*f\n", width, dichotomy(f1, -1.0, 0.0));
printf("%.*f\n", width, iteraciy(f11, -1.0, 0.0));
printf("%.*f\n", width, newton(f1, fp1, -1.0, 0.0));
printf("%.*f\n", width, dichotomy(f2, 2.0, 3.0));
printf("%.*f\n", width, iteraciy(f22, 2.0, 3.0));
printf("%.*f\n", width, newton(f2, fp2, 2.0, 3.0));
return 0;
}Решение задачи: «Ошибка "невозможно преобразовать аргумент"»
textual
Листинг программы
#include<stdio.h>
void f1(double a)
{
printf("%lf\n", a);
}
void f2(double a, double b)
{
printf("%lf %lf\n", a, b);
}
int main(void)
{
void (*fp1)(double) = f1;
void (*fp2)(double, double) = f2;
fp1(1.888);
fp2(1.2, 3.4);
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек: #include
- Объявление двух функций:
- f1(double a) — принимает один аргумент типа double и выводит его значение
- f2(double a, double b) — принимает два аргумента типа double и выводит их значения
- Объявление функции main():
- int main(void) — возвращает значение типа int, не принимает аргументов
- Объявление двух указателей на функции:
- void (*fp1)(double) — указатель на функцию, которая принимает один аргумент типа double и возвращает void
- void (*fp2)(double, double) — указатель на функцию, которая принимает два аргумента типа double и возвращает void
- Вызов функции f1() через указатель fp1 с аргументом 1.888
- Вызов функции f2() через указатель fp2 с аргументами 1.2 и 3.4
- Возврат значения 0 функцией main(), что означает успешный конец работы программы