2017-05-15 18 views
0

プログラミングは非常に新しいです。関数に任意のサイズの配列を読み込むしようとすると...コードが働いように見えることはできません...「配列型が2Dアレイ機能の問題

void printArray(int array[][], int size, int *sumArrayRight, int *sumArrayBot){ 
     int i, j; 
     for(i = 0; i <size; i++){ 
      for(j = 0; j <size; j++){ 
       if(array[i][j] != -1) 
        printf("%3d ", array[i][j]);  
       else 
        printf(" ~ "); 
       if(j == size-1) 
        printf("%3d", *(sumArrayRight+i)); 
      } 
      printf("\n"); 
     } 
     for(i = 0; i < size; i++) 
      printf("%3d ", *(sumArrayBot+i)); 
     printf("\n"); 
    } 

'[] int型不完全要素型を持っている私場合にのみ動作します配列のサイズにはすでに/ int array [10] [10]のように指定しますが、入力される2D配列のサイズが10の場合にのみ動作します...

+2

変更 – Lundin

答えて

2

VLA(Variable Length Array)を使用する必要がありますこれはC99で導入され、C11でオプションとなりましたが、C11でも広く利用できます。gccで-std=c99コンパイラフラグを使用して、そのコードをC99標準にコンパイルするよう指定できます。

VLAを宣言すると、ディメンションに変数を使用できます。しかし、寸法が宣言した後に変更することができないことに注意してください:、この特定の場合について

int my_array[rows][cols]; 

アレイのサイズは、コンパイル時に知られていない場合、実行時に決定される変数で、このサイズを格納し、そしてVLAを宣言するためにそれを使用します。

size_t arr_sz; 
/* Code to determine array size */ 
int array[arr_sz][arr_sz]; 

が関数にVLAを渡すには、引数リスト内の配列名の前に配列の次元を渡す必要があります。配列のインデックスを保持することが保証されているunsigned型であるため、size_tが配列サイズの正しい型であることに注意してください。関数のプロトタイプは次のようになります。

void printArray(size_t size, int array[size][size], int *sumArrayRight, int *sumArrayBot); 

そして、関数呼び出しは次のようになります。 `無効プリントアレイ(int型のサイズ、int配列[サイズ] [サイズ]、...`へ

printArray(arr_sz, array, sumArrayRight, sumArrayBot);