2017-02-12 2 views
1

意図した結果は、入力したのと同じ値を出力しますが、出力は最初の行の後にゼロになります。関数に配列を渡すと値が変更されますか?

#include<stdio.h> 
void display(int *q, int); 

int main() { 
    int i,j,n; 
    int d[50][50]; 
    printf("Input the order\t"); 
    scanf("%d", &n); 

    for (i=0;i<=(n-1);i++) { 
     for (j=0;j<=(n-1);j++) { 
      scanf("%d", &d[i][j]); 
     } 
    } 
    display (d, n); 
} 

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*r + j)); 
     } 
     printf("\n"); 
    } 
} 
+2

コンパイラは 'display'に渡した後に' d'の寸法を知りません。 – goodvibration

+0

多次元配列をCの関数に渡す方法を検索します。たとえば、[this post](http://stackoverflow.com/q/16943909/478288)を参照してください。 – chrisaycock

答えて

0

あなたの関数は、int *のパラメータで宣言されています。ポインタタイプint (*)[50]に減衰するタイプint [50][50]の引数を渡そうとしています。これらのポインタ型は互換性がありません。言語はint (*)[50]からintへの暗黙的な変換をサポートしていません。あなたのコードは有効なCプログラムではありません。私はあなたのコンパイラがあなたにそれについて語ったと確信しています。あなたが使用する必要がありますそのために行うには

より意味のあるものは、しかし

void display (int n, int q[n][n]) 

としてあなたの関数を宣言し、

q[i][j] 

として自然な方法であなたの配列要素にアクセスすることです実際の配列サイズはn(つまり、あなたの場合は50)です。要素のより小さいサブ行列を処理したい場合は、そのサイズを別々に渡す必要があります。

しかし、あなたが本当にあなたの「ハック」を使用したい場合は、

display ((int *) d, n); 

あなたの関数を呼び出すときに明示的なキャストを使用する必要がありますし、元の配列の各行は、まだ50の要素が含まれていることを心に留めておくだろう、宣言されているように、nの値にかかわらず。これは、関数内で行サイズの乗数として50を使用する必要があることを意味します。

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*50 + j)); 
     } 
     printf("\n"); 
    } 
} 
+0

私は本当に誰がこれをdownvotes ... –

0

あなたdisplayルーチンは、[50][50]であるのに対し、2次元配列が[n][n]であることを前提としています。

nと実際の2D配列次元を渡す必要があります。displayルーチンは実際の2D配列サイズを知ることができません。

printf("Input the order\t"); 
    scanf("%d", &n); 
    int d[n][n]; 

をして、(あなたが構造を知っているので)1Dポインタに明示的にキャストすることによって警告

test.c:20:18: warning: passing argument 1 of 'display' from incompatible pointer type 
     display (d, n); 

をここに避ける:

あなたは、このように動的に配列を宣言することができ

display ((int*)d, n); 
+0

誰がこの仕事をしていますか? #include void display(int * q、int); int main() { int a [3] [3] = {1,2,3,4,5,6,7,8,9}; ディスプレイ(a、3); } void display(int * q、int r) { int i、j; j = 0; j

+0

@NibirPawanDas - SOはフォーラムではないので、その考え方を取り除いてください。特に、投稿は議論を促進することではありません。コメント全体にプログラム全体を投稿して議論することを期待しないでください。 – StoryTeller

+0

ディメンションが一致しているため動作します。現在のプログラムに50を入力しても動作します。私の編集をチェックしてください。 –

関連する問題