2016-05-10 1 views
1

私は、djikstraのアルゴリズムを使って迷路を通過する最短経路を見つけるコードを書いています。ポインタを含む配列を正しく渡すには?

私は私の配列を渡すとき、私は私が最初に初期化され、ここでの主に私の行列を割り当てられていた

warning "passing argument 1 of 'traverse' from incompatible pointer type" 
expected 'int (*)[(sizetype)(n)]' but argument is of type 'int **' 

を取得しています:

int **mat; 
mat = (int **)malloc(sizeof(int *)*n); 
for(i=0; i<n; i++){ 
    mat[i]=(int *)malloc(sizeof(int)*n); 
} 

そして、私は

によって機能を作成していますが
void traverse(int mat[n][n], int src){ 

ここでメインでこの関数を呼び出します

traverse(mat, 0); 

私はそれがポインタとして配列を渡すことに問題があると確信していますが、私はあまりにもここの規則に精通していません。どんな助けもありがとうございます。

+1

ようこそ! ['malloc()'と 'C 'のファミリーの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+0

私は今、これを読んで、感謝します。 – r2333

+3

警告: 'void traverse(int mat [n]、int src)' - > 'void traverse(int ** mat、int src)' – LPs

答えて

0

int **matは、 "intへのポインタへのポインタ"です。

int mat[n][n]は、関数パラメータとして、int (*mat)[n]が "intの配列nへのポインタ"と同じです。

ポインタの最初のポイント(秒)は、配列を指します(同じタイプではありません)。


むしろよりint **として渡す、int mat[n1][n2]として、traverse()matを渡します。また、2次元を渡します。

// void traverse(int mat[n1][n2], int src){ 
void traverse(int **mat, size_t n1, size_t n2, int src) { 
... 

は - スタックオーバーフローに

推奨アロケーションコード変更

int **mat; 
size_t n1 = foo(); 
size_t n2 = foo(); 
mat = malloc(sizeof *mat * n1); 
for(size_t i=0; i<n1; i++){ 
    mat[i]= malloc(sizeof *(mat[i]) * n2); 
} 
関連する問題