2017-09-27 14 views
-1

以下のプログラムは、edxのハーバードcs50コースの一部として、ユーザーが入力した寸法に基づいて正方形のグリッドグリッドを印刷することを目的としています。2D配列要素が設定後に変更される

アレイは正しく初期化されていますが、印刷するときは最後の列が常に正しく印刷されません。私は2つのprintf文をinit()関数の最も内側のforループに入れてデバッグを試みました。 一番外側のループが1回実行された後、直前の列のエントリは1だけ減っているように見えますが、直前には正しくなっています。

どうしてですか?正しく印刷してはいけませんか?

#include <stdio.h> 

main() 
{ 
    void init(int dim, int arr[dim-1][dim-1]); 
    int dim; 
    printf("Enter board dimension(max 10): "); 
    scanf("%d", &dim); 

    int arr[dim-1][dim-1]; 

    init(dim, arr); 

    int i,j;  
    for(i=0;i<dim;i++) 
    { 
     for(j=0;j<dim;j++) 
     { 
      printf("%2d ",arr[i][j]); 
     } 
     printf("\n"); 
    } 
} 

void init(int dim, int arr[dim-1][dim-1]) 
{ 
    int i,j,p; 
    for(i=0;i<dim;i++) 
    { 
     for(j=0;j<dim;j++) 
     { 
      arr[i][j] = (dim*dim-1)-i*dim-j; 
     } 
      for(p=0;p<dim;p++) 
      { 
       printf("%d ", arr[i][p]); 
       if(i>=1) 
       printf("%d ", arr[i-1][p]); 
      } 

    } 
    printf("\n"); 
    if(dim%2==0) 
    { 
     arr[dim-1][dim-3] = 1; 
     arr[dim-1][dim-2] = 2; 
    } 
} 

EDIT:それは今

+0

は、なぜあなたは 'のボイドのinit(int型薄暗い、int型ARR [DIM-1] [DIM-1])を宣言します;'で 'main'機能を? –

+2

コンパイルされません。メインに 'i cleblanc

+0

あなたは 'void init(int dim、int arr [dim-1] [dim-1]);'の前に 'main'を宣言する必要があります –

答えて

0

あなたが所望の寸法の短いものであるa[dim - 1][dim - 1]を使用して配列を定義コンパイルする必要があります。ユーザーが "4"を入力した場合、3 × 3配列を作成します。

あなたの配列は2次元で、可変長です。したがって、少なくとも最後の次元については、関数内の配列の横に次元を渡す必要があります。これを正しく実行しますが、コード'init behaves as if the array were a [dim] [dim] , when it's actually [dim - 1] [dim - 1] `のコードです。

実際の次元がdimの配列を定義し、添え字が0からdim - 1の要素にアクセスします。これは通常、このようなループで行われます。同様の>=またはdim - 1何かを見て

for (int i = 0; i < dim; i++) ... 

は、あなたが警戒すべきです。

あなたのプログラムは次のようになります。

#include <stdio.h> 

void init(int dim, int arr[dim-1][dim-1]); 
void print(int dim, int arr[dim-1][dim-1]); 

int main(void) 
{ 
    int dim; 

    printf("Enter board dimension: "); 
    scanf("%d", &dim); 

    int arr[dim][dim]; 

    init(dim, arr); 
    print(dim, arr); 

    return 0; 
} 

void print(int dim, int arr[dim][dim]) 
{ 
    int i,j; 

    for(i = 0; i < dim; i++) { 
     for(j = 0; j < dim; j++) { 
      printf("%2d ", arr[i][j]); 
     } 
     printf("\n"); 
    } 
} 

void init(int dim, int arr[dim][dim]) 
{ 
    int i, j; 

    for(i = 0; i < dim; i++) { 
     for(j = 0; j < dim; j++) { 
      int ii = dim - 1 - i; 
      int jj = dim - 1 - j; 

      arr[i][j] = ii*dim + jj; 
     } 
    } 
} 
+0

ありがとうございました。初期化時に配列の大きさを表す配列インデックスが0からarr [i] [j]まで混乱していました。 – CodeChef123

関連する問題