0

2次元配列を関数に渡そうとしていますが、常にこのエラーがスローされます。私のコードは以下の通りです:

void initialize_centroids(int *,int,int);(Initialization)

initialize_centroids(centroid[0],noofcentroids,newnoofvar);(inside my main)

void initialize_centroids(int *carray,int p,int q)
{
    int i,j;
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
           carray[i][j]=i;
        }
    }

    return;
}
4

2 に答える 2

1

int()へのポインタを渡していますが、int*2つの添え字を使用しようとしています。2Dアレイですか?次に、パラメータはintへのポインタへのポインタである必要があります。int**

void initialize_centroids(int**, int, int);

int centroid[][] = ....  // wherever this comes from
initialize_centroids(centroid, noofcentroids, newnoofvar);(inside my main)



void initialize_centroids(int** carray, int p, int q)
{
    int i,j;
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
            carray[i][j]=i;
        }
    }

    return;
}
于 2012-09-14T03:40:19.010 に答える
1

渡すときに参照を解除しないでくださいcentroid。参照を解除すると、最初の行のみが渡されます。これを行う:

initialize_centroids( centroid, noofcentroids, newnoofvar );

次に、ここで正しいタイプを使用する必要があります。

void initialize_centroids( int **carray, int p, int q )

あなたの配列はおそらくint**。これは、ポインタの配列を含むメモリ内の場所へのポインタであることを意味しint*ます。これらの各ポインタ(私は推測します)は、配列の1行に割り当てられたメモリを参照します。

carray[i]ここで、行を選択してこれらのポインターの1つを取得したらiint*これで、の配列を指すことを意味するができましたint

最後に、行の列carray[i][j]から特定の整数を選択します。ji

[編集]

何がうまくいかないかについての理論...動的な意味で2D配列を割り当てていないか、実際には1D配列であり、ストライド長などを使用することになっている可能性があります。これが使用できるソリューションです。 2D配列を動的に割り当て、インデックスを作成しcarray[i][j]ます。

注:これまで、アライメントの問題でこの方法に腹を立てた人もいますが、問題が発生したことはありません。彼らはただ不機嫌な一日を過ごしていたと思います。位置合わせが気になる方は、調整は簡単ですが、この例では複雑すぎます。

int** allocate_array2d( int rows, int cols )
{
    int i, **arr, *data;
    arr = (int**)malloc( rows * sizeof(int*) + rows*cols*sizeof(int) );
    data = (int*)(arr + rows);
    for( i = 0; i < rows; i++ ) {
        rows[i] = data;
        data += cols;
    }
    return arr;
}

void free_array2d( int** arr ) {
    free((void*)arr);
}

今、あなたのメインで:

int** centroid = allocate_array2d( noofcentroids, newnoofvar );
initialize_centroids( centroid, noofcentroids, newnoofvar );

[もっと...]

はい、この重心のようなメモリを割り当てました[100] [100] –ボビー11分前

その場合、次のように宣言する必要があります。

void initialize_centroids( int carray[100][100], int p, int q )
{
    //...
}

動的配列の例を使用する必要はありません

于 2012-09-14T03:47:33.917 に答える