Ошибка "невозможно преобразовать аргумент" - 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"
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;
    }
и та самая "fp1"- производная моей функции, для вычисления методом Ньютона
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;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек: #include
  2. Объявление двух функций:
    • f1(double a) — принимает один аргумент типа double и выводит его значение
    • f2(double a, double b) — принимает два аргумента типа double и выводит их значения
  3. Объявление функции main():
    • int main(void) — возвращает значение типа int, не принимает аргументов
  4. Объявление двух указателей на функции:
    • void (*fp1)(double) — указатель на функцию, которая принимает один аргумент типа double и возвращает void
    • void (*fp2)(double, double) — указатель на функцию, которая принимает два аргумента типа double и возвращает void
  5. Вызов функции f1() через указатель fp1 с аргументом 1.888
  6. Вызов функции f2() через указатель fp2 с аргументами 1.2 и 3.4
  7. Возврат значения 0 функцией main(), что означает успешный конец работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы