1

いくつかのベクトルとそれに対応する係数をとる小さなCプログラムがあります。この情報を使用して、ベクトルの長さ(モジュラス)を計算します。次に、プログラムは長さでベクトルを使用して配列を並べ替え、すべてのベクトルを正しい順序で表示します。

すべてが正常に機能しているようです。ただし、-wall引数と-ansi引数を使用してコードをコンパイルすると、次の警告が表示されます。

|23|warning: ISO C90 forbids variable-size array 'v'
|23|warning: ISO C90 forbids mixed declarations and code
|44|warning: passing argument 1 of 'swap' from incompatible pointer type
|44|warning: passing argument 2 of 'swap' from incompatible pointer type

私が使用するコード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void swap(double **p, double **q)
{
    double *tmp;

    tmp = *p;
    *p = *q;
    *q = tmp;
}

int main()
{
    int dim, num;
    int i, j;
    double **w;

    scanf("%d %d", &dim, &num);
    w = calloc(num, sizeof(double *));

    double v[num];

    /* Get vector coefficients for each vector and calculate the length of each vector */
    for(i = 0; i < num; i++)
    {
        w[i] = calloc(dim, sizeof(double));

        for(j = 0; j < dim; j++)
        {
            scanf("%le", &w[i][j]);
            v[i] += pow(w[i][j], 2);
        }
    }

    /* Sort vectors by length */
    for(i = 0; i < num-1; ++i)
    {
        for(j = num-1; j > i; --j)
            if(v[j-1] > v[j])
            {
                swap(&w[j-1], &w[j]);
                swap(&v[j-1], &v[j]);
            }
    }    

    /* Display vectors, including their coefficients, ordered by length */
    for(i = 0; i < num; i++)
    {
        for(j = 0; j < dim; j++)
        {
            printf("%e", w[i][j]);
            if(j != dim)
                printf(" ");
        }
        printf("\n");
    }

    return 0;
}

これらの警告を修正する方法について何かアイデアはありますか?

前もって感謝します。

4

2 に答える 2

1

同じ関数で 2 つの異なる型を交換しようとしています。

swap(&w[j-1], &w[j]);
swap(&v[j-1], &v[j]);

&w[j]adouble**&v[i]aはどこにありますかdouble*。C にはオーバーロードがないため、これは機能しません。void*ポイント先の値を間に保存する必要があるため、引数を使用することさえできません。

そのためには 2 つの別個の関数、またはマクロが必要です (ただし、タイプ セーフは失われます)。

宣言とコードと可変長配列の混在については、-std=c99代わりに を使用し-ansiます。

于 2012-11-24T14:37:57.910 に答える
1

試す:

double *v;
v=(double *)malloc(num * sizeof(double));

それ以外の

double v[num];
于 2012-11-24T14:34:17.680 に答える