Когда я пытаюсь скомпилировать, я получаю два сообщения об ошибках, о которых я какое-то время думал и не мог разрешить. Может ли кто-нибудь пролить свет на мою проблему?
ошибки:
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);
}
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;
}
На самом деле объявление функции в списке параметров является абсолютно допустимым. Правило аналогично правилу для объявления параметров массива; тип настраивается от «функция …» до «указатель на функцию …».
Например, в следующем примере функция 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), программа скомпилируется. (Я не могу сказать, является ли это семантически исправить, потому что я не могу прочитать ни один из идентификаторов; они на голландском, верно?)
Объявление функции не является допустимым параметром для функции.
Кроме того, это совершенно не нужно в вашем случае, так как все, что вам нужно сделать, это просто позвонить leeftijd_in_jaren
, который уже виден в объеме leeftijd_in_maanden
,
Пожалуйста, попробуйте опубликовать действительно полезный прецедент в следующий раз.