渡すときに参照を解除しないでくださいcentroid
。参照を解除すると、最初の行のみが渡されます。これを行う:
initialize_centroids( centroid, noofcentroids, newnoofvar );
次に、ここで正しいタイプを使用する必要があります。
void initialize_centroids( int **carray, int p, int q )
あなたの配列はおそらくint**
。これは、ポインタの配列を含むメモリ内の場所へのポインタであることを意味しint*
ます。これらの各ポインタ(私は推測します)は、配列の1行に割り当てられたメモリを参照します。
carray[i]
ここで、行を選択してこれらのポインターの1つを取得したらi
、int*
これで、の配列を指すことを意味するができましたint
。
最後に、行の列carray[i][j]
から特定の整数を選択します。j
i
[編集]
何がうまくいかないかについての理論...動的な意味で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 )
{
//...
}
動的配列の例を使用する必要はありません