2

メニューを印刷して選択肢を返す関数が1つあります。そして、ユーザーから取得した2つの数値を計算する別の関数。さて、計算は最初の関数からの選択リターンに依存しており、2つの異なるタイプの関数を一緒に使用する正しい方法が何であるかを本当に知りません...これは両方の関数です:

float calc(float number1, float number2)

{
    float answer;
    int operand;
    operand =get_choice();// problemmmm

}

char get_choice(void)

{
    char choice;

    printf("Enter the operation of your choice:\n");
    printf("a. add        s. subtract\n");
    printf("m. multiply   d. divide\n");
    printf("q. quit");

    while ((choice = getchar()) != 'q')
    {

        if (choice != 'a' || choice != 's' || choice != 'm' || choice != 'd')
        {
            printf("Enter the operation of your choice:\n");
            printf("a. add        s. subtract\n");
            printf("m. multiply   d. divide\n");
            printf("q. quit");
            continue;
        }
    }
    return choice;
}

「get_choice の暗黙的な関数は C99 では無効です」というエラーが表示されました。

4

4 に答える 4

1

get_choiceこの暗黙的な関数エラーは、関数が呼び出されたときに関数がその行に到達するまでに、コンパイラがまだその関数について認識していないことを意味している可能性があります。これは、どちらかで修正できます。

  1. 関数を記述する順序を変更します。calc 関数の前に get_choice を記述します。

  2. calc 関数の前に get_choice 関数の宣言を追加します。宣言は、コードなしで、関数の名前と型だけになります。

    char get_choice(void);
    

メッセージが何であるか疑問に思っている場合、C89 では、宣言されていない関数は暗黙的に整数を返すと想定されていました。C99 はより厳密であり、常に関数を宣言する必要がありますが、エラー メッセージは依然として C89 スタイルの暗黙的な宣言を参照しています。

于 2013-02-03T04:45:41.360 に答える
0

演算子によって異なる計算を実行しようとしていますか? 関数ポインターを使用してそれを実現できます。つまり、各選択肢 ('a'、's'、'm'、'd') をそれぞれ関数ポインタ型の演算 (加算、減算、乗算、除算) にマップする辞書を作成しますfloat (*)(float, float)

ところで、宣言していない場合はget_choice、関数本体を BEFORE に配置する必要がありますcalc。もう 1 つの問題はget_choice(void)returncharですが、オペランドを として宣言しintます。

于 2013-02-03T04:32:10.640 に答える
0

I got an error saying "implicit function of get_choice is invalid in C99"

In C, you need to declare a function before you call it; otherwise the compiler doesn't know what the return type is supposed to be.

You can do one of two things. One, you can declare the get_choice function before you call it:

float calc(float number1, float number2)
{
    float answer;
    int operand;

    char get_choice(void);

    operand =get_choice();// problemmmm
}

Alternately, you can switch the order in which the functions are defined, so that the get_choice function is defined before it's called (my preference).

于 2013-02-03T04:55:00.373 に答える
0

IC/C++、コンパイラは識別子の型 (サイズ) を知る必要がありますが、それが保持する特定の値 (変数の場合) を知る必要はありません。これを前方宣言と呼びます

あなたの場合、コンパイラはget_choice()いつから呼び出すかを知りませんcalc()

于 2013-02-03T05:00:17.060 に答える