в C ++, почему мой указатель на функцию не может быть инициализирован? - PullRequest
0 голосов
/ 09 января 2012

в C ++, почему мой указатель на функцию не может быть инициализирован?

 double (*ptrF)(double&) = NULL;    

 double func(double& x)
 {
     return x*x;
 }
 ptrF= &func; 

 double aFunc(double target, double start, double tolerance, double (*ptrF)(double&) )

 void findSqrt()
{
    double myF = 2.0 ; double myStart = 1.1 ; 
    double t = aFunc(myF, myStart , ptrF); 
    cout << "myF  sqrt root is " << t << endl ; 
 }

Я получил ошибку:

  error: expected constructor, destructor, or type conversion before '=' token

  error: cannot convert 'double (*)(double&)' to 'double' for argument '3' to 'double newton(double, double, double, double (*)(double&))'

спасибо

Ответы [ 4 ]

2 голосов
/ 09 января 2012

Код не может быть запущен вне функции.

Это пытается запустить код:

ptrF= &func;

Это потому, что это не декларация.
Если вы переместите это внутрь функции, она будет работать

В качестве альтернативы вы можете инициализировать его в точке объявления.

double (*ptrF)(double&) = &func;

Недостаточно параметров:

 aFunc(myF, myStart ,    ptrF);  
 //                  ^^^^   Missing a double here

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

1 голос
/ 09 января 2012

У вас есть две отдельные ошибки:

ошибка: ожидаемый конструктор, деструктор или преобразование типа до маркера '='

Вы не можете написать назначение

ptrF= &func; 

вне какой-либо функции.Переместите объявление ptrF ниже определения func и сделайте вместо него инициализацию , которую вы можете записать в области видимости файла, как предложено alk.& в &func также не требуется.

ошибка: невозможно преобразовать 'double (*)(double&)' в 'double' для аргумента '3' в 'double aFunc(double, double, double, double (*)(double&))'

Вы передаете только три аргумента aFunc, но вам нужны четыре.Добавьте аргумент tolerance, и ошибка «невозможно преобразовать» должна исчезнуть.(Я не знаю, почему GCC не дает вам еще одно сообщение об ошибке, сообщающее, что вы указали неправильное количество аргументов. Это относится к Си.)

1 голос
/ 09 января 2012

Вы можете попробовать это:

double func(double& x)
{
    return x*x;
}

double (*ptrF)(double&) = func;

...

double t = aFunc(myF, myStart , 0., ptrF); 
0 голосов
/ 09 января 2012

double aFunc (двойная цель, двойной старт, двойной допуск, double (* ptrF) (double &))

Вы пытались сделать с помощью описанной выше строки - объявление функции (или) определение функции ?!в любом случае это неправильно / не полностью.

И вы звоните aFunc следующим образом:

double t = aFunc(myF, myStart , ptrF); 

Одна очевидная вещь, которую я мог видеть, это несоответствие сигнатур междуспособ aFunc объявляется / определяется (согласно первой строке в этом посте - 4 аргумента) и вызывается (3 аргумента)

Есть несколько ошибок / проблем, но чтобы продолжить, вам нужно исправитьВышеупомянутый вопрос первым!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...