2016-10-15 22 views
0

基本的に、以下のコードでは、2次元配列を初期化する関数を持っています。主な関数では、配列のサイズが違う関数をテストしようとします。しかし、私は次のエラーを受け取ります: "エラー:配列型が不完全な要素型を持っています void chessBoard(char board [] []、int length、int width)"と "error:仮パラメータ1の型が不完全です"。 チェスボード(board1、length1、width1);.助言がありますか?2次元配列型エラー

#include <stdio.h> 
    #include <stdlib.h> 

    void chessBoard(char board[][], int length, int width) 
    { 
     for (int i = 0; i < length; i++) 
     { 
     for (int j = 0; j < width; j++) 
      if ((i + j) % 2 == 0) 
      board[i][j] = 'b'; 
      else 
      board[i][j] = 'w'; 
     } 
    } 

    int main() 
    { 
     char board1 [3][4]; 
     int length1 = sizeof board1/sizeof board1[0]; 
     int width1 = sizeof board1[0]/sizeof(int); 
     chessBoard(board1, length1, width1); 
     int i, j; 
     for(i = 0; i < length1; i++) 
     { 
     for(j = 0; j < width1; j++) 
      printf("%c", board1[i][j]); 

     printf("\n"); 
     } 
     printf("\n"); 
} 
+0

'空隙チェス盤(チャーボード[] []、int型の長さ、INT幅)' - > '空隙チェス盤(INT幅、チャーボード[] [幅]、int型の長さ)' 'はsizeof( int型) ' - >' sizeof(char) ' – BLUEPIXY

+0

関数の引数に配列があるのは、実際には配列ではなく*ポインタ*であるということです。 'int arr []'のような引数を宣言しても、コンパイラはそれを 'int * arr'として扱います。 –

答えて

0

あなたはこのようにあなたの関数を宣言する必要があります。

void chessBoard(char board[][4], int length, int width) 

このC FAQ徹底的に理由を説明します。その要点は、配列は一度ポインタに崩壊するということです。再帰的に起こるわけではありません。配列の配列は、ポインタへのポインタではなく、配列へのポインタに減衰します。 C標準によれば、すべての次元を最初のもの(ブランクにすることができる)を除いて定数として指定する限り、次元配列を関数に渡すことができます。

+2

C99(コンパイラがVLA(可変長配列)をサポートする場合はC11)では、配列の次元は定数である必要はありません。 'void chessBoard(int length、int width、char board [length] [width])'と同様の定義を使うことができます。 –

+0

"このような関数を宣言する"は、第2のサイズを '4'で固定します。これは明らかにOPに必要なものではありません。 – AnT

0

このような関数を宣言することもできます。 void chessBoard(char board[][width], int length)int widthはグローバル変数です。

#include <stdio.h> 
#include <stdlib.h> 
int width;//Global Variable 
void chessBoard(char board[][width], int length){ 
    int i,j; 
    for (i = 0; i < length; i++){ 
     for (j = 0; j < width; j++){ 
      if ((i + j) % 2 == 0) 
       board[i][j] = 'b'; 
      else 
       board[i][j] = 'w'; 
     }//inner loop end 
    }//outer loop end 
} 
int main(){ 
    char board1[3][4]; 
    int length1 = sizeof(board1)/sizeof(board1[0]); 
    int width1 = sizeof(board1[0])/sizeof(board1[0][0]); 
    width = width1; 
    chessBoard(board1, length1); 
    int i, j; 
    for(i = 0; i < length1; i++){ 
     for(j = 0; j < width1; j++) 
      printf("%c ", board1[i][j]); 
      printf("\n"); 
    } 
    printf("\n"); 
}