1

コンパイルしようとすると、しばらく考えて解決できなかった 2 つのエラー メッセージが表示されます。誰かが私の問題に光を当てることができますか?

エラー:

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

実際、パラメーター リスト内の関数宣言は完全に有効です。この規則は、配列パラメータ宣言の規則に似ています。型は「関数...」から「関数へのポインタ...」に調整されます。

たとえば、次の関数 foo() には 2 つのパラメーターがあります。1 つ目は typeint*で、2 つ目は 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)は、関数呼び出しの形式です。関数は を返すため、 が期待する関数へのポインタではなく、inttype の式です。intleeftijd_in_maanden()

代わりに、関数の名前だけを渡す必要があります (関数へのポインターに暗黙的に変換されます)。

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

その変更 (50 行目) を行うと、プログラムはコンパイルされます。(どの識別子も読めないので、意味的に正しいかどうかわかりません。オランダ語ですよね?)

于 2012-09-16T03:31:54.730 に答える
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 に答える
-1

関数宣言は、関数の有効なパラメーターではありません。また、あなたの場合は完全に不要です.leeftijd_in_jarenのスコープですでに表示されている を呼び出すだけですleeftijd_in_maanden.

次回は実際に役立つテストケースを投稿してみてください。

于 2012-09-15T14:00:44.700 に答える