2016-10-15 2 views
0

В принципе, в приведенном ниже коде у меня есть функция, которая инициализирует двумерный массив. В основной функции я пытаюсь проверить функцию с различными размерами массива. Однако я получаю следующие ошибки: «error: тип массива имеет неполный тип элемента void chessBoard (char board [] [], int length, int width)» и «error: тип формального параметра 1 является неполным». chessBoard (доска1, длина1, ширина1) ;. Какие-либо предложения?Ошибки двумерного массива

#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, символ доска [] [ширина], длина целое),' 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 (и C11, если компилятор поддерживает VLAs - массивы переменной длины), размеры массива не обязательно должны быть константами. Вы можете использовать: 'void chessBoard (int length, int width, char board [length] [width])' и подобные определения. –

+0

«Объявление этой функции» заморозит второй размер на '4'. Очевидно, это не то, что требуется ОП. – 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"); 
} 
Смежные вопросы