0

いくつかのフロートの平均を計算するためにこの関数を作成しましたが、「平均」関数の最後の行で実行時エラーが発生します。何が問題なのですか?

#include <stdarg.h>
#include <stdio.h>



float average(float first , ...)
{
    int count = 0;
    float sum = 0 , i = first;

    va_list marker;

    va_start(marker , first);
    while(i != -1)
    {
        sum += i;
        count++;
        i = va_arg(marker , float);
    }

    va_end(marker);
    return(sum ? (sum / count) : 0);
}


int main(int argc , char* argv[])
{
    float avg = average(12.0f , 34.0f);

    printf("The average is : %f\n" , avg);
    scanf("a\n");
}
4

4 に答える 4

4

関数は を検出するまでループ-1し、呼び出し元は . を提供していません-1

私のボックスのマニュアルページは、「ランダムエラー」を約束しています:

va_arg()
   ...
   If  there  is  no  next argument, or if type is not compatible with the
   type of the actual next argument (as promoted according to the  default
   argument promotions), random errors will occur.

試す:

float avg = average(12.0f, 34.0f, -1f);
于 2012-05-03T16:46:15.757 に答える
2

呼び出しをで終了するのを忘れたため、渡したよりも多くの引数を取得し続けようとする-1ため、ループによって未定義の動作が発生します。whileそのはず:

float avg = average(12.0f, 34.0f, -1f);

また、float引数は可変個引数関数に渡されるときにに昇格されるため、で使用するdoubleことはできません。あなたはこれすべてのために使うべきです:floatva_argdouble

double average(double first, ...)
{
    int count = 0;
    double sum = 0, i = first;

    va_list marker;

    va_start(marker, first);
    while(i != -1)
    {
        sum += i;
        count++;
        i = va_arg(marker, double);
    }

    va_end(marker);

    return sum ? sum / count : 0;
}

double avg = average(12.0, 34.0, -1.0);
于 2012-05-03T16:45:38.853 に答える
2

while ループを停止するために、最後の引数として -1 を渡したくありませんか?

また、VAを使用するとfloatはdoubleに変換されると思うので、floatをdoubleに変更すると良いでしょう...

于 2012-05-03T16:49:02.127 に答える
2

問題は、while ループの終了がないことです。をチェックしていますが-1、決して渡さないで-1ください。average関数を次のように呼び出す必要があります

float avg = average(12.0f ,34.0f, -1);

この例のランタイム例がva_arg、va_end、va_startにあり、ほぼ正確にコードを示していますが、int代わりにfloat値を使用しています。

于 2012-05-03T16:50:45.933 に答える