Внутренняя функция распознается как указатель

Когда я пытаюсь скомпилировать, я получаю два сообщения об ошибках, о которых я какое-то время думал и не мог разрешить. Может ли кто-нибудь пролить свет на мою проблему?

ошибки:

leeftijd.cc: In function ‘int main()’:
leeftijd.cc:50:49: error: invalid conversion from ‘int’ to ‘int (*)(int, int, int)’ [-fpermissive]
leeftijd.cc:10:9: error:   initializing argument 1 of ‘int leeftijd_in_maanden(int (*)(int, int, int), int, int, int)’ [-fpermissive]

Код:

#include <iostream>  // Line one
//line two
#define PEILJAAR 2012
#define PEILMAAND 9
#define PEILDAG 23

using namespace std;

int leeftijd_in_jaren(int _geboortejaar, int _geboortemaand, int _geboortedag);
int leeftijd_in_maanden(int _leeftijd_in_jaren(int _geboortejaar, int _geboortemaand, int _geboortedag),
int _geboortejaar, int _geboortemaand, int _geboortedag);

bool onjuiste_geboortedag(int _geboortedag, int _geboortejaar);
bool onjuiste_geboortemaand(int _geboortemaand, int _geboortejaar);
bool onjuiste_geboortejaar(int _geboortejaar);

int main()
{
int geboortejaar, geboortemaand, geboortedag;

cout << " Geef uw geboortejaar" << endl;
cin >> geboortejaar;
if( onjuiste_geboortejaar(geboortejaar) )
{
cout << "U voldoet niet aan de eisen." << endl;
return 0;
}

cout << " Geef uw geboortemaand" << endl;
cin >> geboortemaand;
if( onjuiste_geboortemaand(geboortemaand, geboortejaar) )
{
cout << "U voldoet niet aan de eisen." << endl;
return 0;
}

cout << " Geef uw geboortedag" << endl;
cin >> geboortedag;
if( onjuiste_geboortedag(geboortedag, geboortejaar) )
{
cout << "U voldoet niet aan de eisen." << endl;
return 0;
}

cout << "U bent "<< leeftijd_in_jaren(geboortejaar, geboortemaand, geboortedag)
<< " jaar en "<< " maanden en uw leeftijd in maanden is "<< leeftijd_in_maanden( leeftijd_in_jaren(geboortejaar, geboortemaand, geboortedag),
geboortejaar, geboortemaand, geboortedag)
<< "."   << endl;
return 0;
}

int leeftijd_in_jaren(int _geboortejaar, int _geboortemaand, int _geboortedag)
{
int _leeftijd_in_jaren;
if(_geboortemaand < PEILMAAND || _geboortemaand == PEILMAAND && _geboortedag <= PEILDAG)
{_leeftijd_in_jaren = PEILJAAR - _geboortejaar;}
else{_leeftijd_in_jaren = PEILJAAR - _geboortejaar - 1;}
return _leeftijd_in_jaren;
}

int leeftijd_in_maanden(int _leeftijd_in_jaren(int _geboortejaar, int _geboortemaand, int _geboortedag),
int _geboortejaar, int _geboortemaand, int _geboortedag)
{
int _leeftijd_in_maanden =
_leeftijd_in_jaren(_geboortejaar, _geboortemaand, _geboortedag) * 12 + _geboortemaand;
return _leeftijd_in_maanden;
}bool onjuiste_geboortejaar(int _geboortejaar)
{return((PEILJAAR - _geboortejaar) < 10 || (PEILJAAR - _geboortejaar) > 100);}

bool onjuiste_geboortemaand(int _geboortemaand, int _geboortejaar)
{
return( (PEILJAAR - _geboortejaar) == 10  && _geboortemaand > PEILMAAND ||
(PEILJAAR - _geboortejaar) == 100 && _geboortemaand > PEILMAAND ||
_geboortemaand < 0 || _geboortemaand > 12);
}

bool onjuiste_geboortedag(int _geboortedag, int _geboortejaar)
{
return( PEILDAG <= _geboortedag  && (PEILJAAR - _geboortejaar) == 10 ||
PEILDAG >= _geboortedag  && (PEILJAAR - _geboortejaar) == 100||
_geboortedag < 0   || _geboortedag > 31);
}

1

Решение

int leeftijd_in_maanden(int _leeftijd_in_jaren(int _geboortejaar, int _geboortemaand, int _geboortedag),int _geboortejaar, int _geboortemaand, int _geboortedag)

Выше недопустимое объявление указателя функции в списках параметров.

Использование: —

int leeftijd_in_maanden(int (*funcpoint)(int , int , int ),int _geboortejaar, int _geboortemaand, int _geboortedag)
{
int _leeftijd_in_maanden =
funcpoint(_geboortejaar, _geboortemaand, _geboortedag) * 12 + _geboortemaand;
return _leeftijd_in_maanden;
}
0

Другие решения

На самом деле объявление функции в списке параметров является абсолютно допустимым. Правило аналогично правилу для объявления параметров массива; тип настраивается от «функция …» до «указатель на функцию …».

Например, в следующем примере функция foo () имеет два параметра; первый тип int*и второй тип void(*)(void)то есть тип указателя на функцию.

void foo(int not_really_an_array[20],
void not_really_a_function(void))
{
}

int main() {
int *int_ptr = 0;
void (*func_ptr)(void) = 0;
foo(int_ptr, func_ptr);
}

Ошибка в коде в вопросе не в объявлении leeftijd_in_maanden()это в вызове:

...
<< leeftijd_in_maanden( leeftijd_in_jaren(geboortejaar, geboortemaand, geboortedag),
geboortejaar, geboortemaand, geboortedag)
...

Первый аргумент, leeftijd_in_jaren(geboortejaar, geboortemaand, geboortedag), имеет вид функции вызов; так как функция возвращает intэто выражение типа int, а не указатель на функцию, ожидаемую leeftijd_in_maanden(),

Вместо этого вам нужно передать только название функции (которая неявно преобразуется в указатель на функцию):

...
<< leeftijd_in_maanden( leeftijd_in_jaren,
geboortejaar, geboortemaand, geboortedag)
...

Если вы сделаете это изменение (оно в строке 50), программа скомпилируется. (Я не могу сказать, является ли это семантически исправить, потому что я не могу прочитать ни один из идентификаторов; они на голландском, верно?)

0

Объявление функции не является допустимым параметром для функции.
Кроме того, это совершенно не нужно в вашем случае, так как все, что вам нужно сделать, это просто позвонить leeftijd_in_jaren, который уже виден в объеме leeftijd_in_maanden,

Пожалуйста, попробуйте опубликовать действительно полезный прецедент в следующий раз.

-1
По вопросам рекламы [email protected]