1

当我尝试编译时,我收到两条错误消息,我想了一会儿,无法解决。有人可以阐明我的问题吗?

错误:

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); 
}
4

3 回答 3

0
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;
}
于 2012-09-15T14:05:33.717 回答
0

事实上,参数列表中的函数声明是完全有效的。该规则类似于数组参数声明的规则;类型从“function ...”调整为“pointer to function ...”。

例如,下面的函数 foo() 有两个参数;第一个是 type int*,第二个是 type 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,它是 type 的表达式int,而不是 . 所期望的指向函数的指针leeftijd_in_maanden()

相反,您只需要传递函数的名称(隐式转换为指向函数的指针):

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

如果您进行了更改(在第 50 行),程序将编译。(我不知道它在语义上是否正确,因为我看不懂任何标识符;它们是荷兰语,对吗?)

于 2012-09-16T03:31:54.730 回答
-1

函数声明不是函数的有效参数。此外,在您的情况下完全没有必要,因为您所做的只是 call leeftijd_in_jaren,这已经在leeftijd_in_maanden.

下次请尝试发布一个实际有用的测试用例。

于 2012-09-15T14:00:44.700 回答