1

ユニットテストコードをコンパイルしようとすると、奇妙なエラーが発生します。何らかの理由で、コンパイラは私のsscanf呼び出しを混合宣言として扱いますか?私は完全には理解していません、ここに全体のエラーがあります:

cc1: warnings being treated as errors
/home/brlcad/brlcad/src/libbn/tests/bn_complex.c: In function 'main':
/home/brlcad/brlcad/src/libbn/tests/bn_complex.c:53: error: ISO C90 forbids mixed declarations and code
make[2]: *** [src/libbn/tests/CMakeFiles/tester_bn_complex.dir/bn_complex.c.o] Error 1
make[1]: *** [src/libbn/tests/CMakeFiles/tester_bn_complex.dir/all] Error 2
make: *** [all] Error 2

int
main(int argc, char *argv[])
{
    double expRe1, expIm2, expSqRe1, expSqIm2;
    double actRe1, actIm2, actSqRe1, actSqIm2;
    actRe1 = actIm2 = actSqRe1 = actSqIm2 =
    expRe1 = expIm2 = expSqRe1 = expSqIm2 = 0.0;
    bn_complex_t com1,com2; //a struct that holds two doubles
    if(argc < 5)
        bu_exit(1, "ERROR: Invalid parameters[%s]\n", argv[0]);

    sscanf(argv[1], "%lf,%lf", &com1.re, &com1.im); /* Error is HERE */
    sscanf(argv[2], "%lf,%lf", &com2.re, &com2.im);
    sscanf(argv[3], "%lf,%lf", &expRe1, &expIm2);
    sscanf(argv[4], "%lf,%lf", &expSqRe1, &expSqIm2);

    test_div(com1, com2, &actRe1, &actIm2);
    test_sqrt(com1,com2, &actSqRe1, &actSqIm2);

    if((fabs(actRe1 - expRe1) < 0.00001) || (fabs(actIm2 - expIm2) < 0.00001)){
        printf("Division failed...\n");
        return 1;
    }
    if((fabs(actSqRe1 - expSqRe1) < 0.00001) || (fabs(actSqIm2 - expSqIm2) < 0.00001)){
        printf("Square roots failed...\n");
        return 1;
    }
    return 0;
}
4

3 に答える 3

7

C90 では、すべての宣言をブロックの先頭に置く必要があります。これを入れてください:

bn_complex_t com1,com2; //a struct that holds two doubles

これらのステートメントの上に:

actRe1 = actIm2 = actSqRe1 = actSqIm2 =
expRe1 = expIm2 = expSqRe1 = expSqIm2 = 0.0;
于 2012-12-14T22:48:33.663 に答える
3

C90 では、すべての宣言がブロック内のすべてのステートメントの前にある必要があります。

C99 (C++ と同様) では、宣言とステートメントを混在させることができます。

割り当てステートメントがあります。

actRe1 = actIm2 = actSqRe1 = actSqIm2 =
expRe1 = expIm2 = expSqRe1 = expSqIm2 = 0.0;

宣言が続きます。

bn_complex_t com1,com2;

(呼び出しについて不平を言うべきではありませんsscanf。ソース ファイルに対してエラー メッセージの行番号を確認してください。)

コードを再配置するかMakefile、C99 モードでコンパイラを呼び出すように変更することができます。gcc を使用しているようです。を使用します-std=c99(または-std=gnu99、GNU 固有の拡張機能が必要な場合。(これを行う方法の詳細は、記述方法によって異なりますMakefile。)

または、割り当てを初期化子 (ステートメントとしてカウントされない) に置き換えることができます。

個人的には、各宣言を 1 行で行うことを好みます。私はこれを変更します:

double expRe1, expIm2, expSqRe1, expSqIm2;
double actRe1, actIm2, actSqRe1, actSqIm2;
actRe1 = actIm2 = actSqRe1 = actSqIm2 =
expRe1 = expIm2 = expSqRe1 = expSqIm2 = 0.0;

これに:

double expRe1   = 0.0;
double expIm2   = 0.0;
double expSqRe1 = 0.0;
double expSqIm2 = 0.0;

double actRe1   = 0.0;
double actIm2   = 0.0;
double actSqRe1 = 0.0;
double actSqIm2 = 0.0;

しかし、よりコンパクトなレイアウトを好む場合は、次のように記述できます。

double expRe1 = 0.0, expIm2 = 0.0, expSqRe1 = 0.0, expSqIm2 = 0.0;
double actRe1 = 0.0, actIm2 = 0.0, actSqRe1 = 0.0, actSqIm2 = 0.0;

1 行で複数の変数を宣言する場合でも、変数ごとに初期化子が必要です。

于 2012-12-14T22:59:03.377 に答える
2

コンパイラによってエラーが検出された理由はわかりませんが、C90 ではすべての変数宣言がブロックの先頭にある必要があるため、bn_complex_ts に問題があります。

于 2012-12-14T22:48:15.533 に答える