2017-02-03 4 views
0

Вот код:точка в 2D массив, используя двойной указатель

void nextGeneration(int **board) { 

int editBoard[row][col]; 
    ... 
    displayBoard(editBoard); 
} 

void displayBoard(int **board) { 
    ... 
} 

Я получаю эту ошибку: Сообщ

GOL.c: В функции '' последующих поколений: GOL.c : 64: warning: передача аргумент 1 из 'displayBoard' из несовместимого типа указателя GOL.c: 28: примечание: ожидается 'int **', но аргумент имеет тип 'int (*) [(long unsigned int) (седло)] '

Я просто не знаю, как указывать 2D-массив, который будет принят для отмены функции displayBoard (int ** board).

Как я могу это сделать?

Большое спасибо

+4

двойной указатель не 2D массив .... – LPs

+0

Вы можете использовать массив указателей на-вместо этого, если размеры фиксированы или могут быть переданы функции.Если вы действительно хотите передать двойной указатель, вам нужно создать массив 'int *', поместить каждый указатель в соответствующую строку 2D-массива и передать это ... но это, вероятно, не лучший способ пойти. – Dmitri

ответ

1

Двойной указатель не является 2D массив, но вы можете сделать это с помощью одного указателя

#include <stdio.h> 

#define COL_WIDTH 2 

int displayBoard(int *board, int row, int col) 
{ 
    // editBoard[row][col] 
    return board[(COL_WIDTH*row)+col]; 
} 

int main(void) 
{ 
    int board[2][COL_WIDTH] = { {1,2}, {3,4} }; 

    printf("%d\n", displayBoard((int *)(board), 1, 1)); 
    printf("%d\n", displayBoard((int *)(board), 0, 1)); 
} 
+0

C поддерживает двумерные массивы (массивы массивов). Так почему бы не использовать один вместо индексации, подверженной ошибкам вручную? Это даже не VLA, поэтому он будет работать и с до-современными C. – Olaf

+0

@ Олаф ты прав, но я отвечал на ОП с точки зрения указателя. Другой ответ показывает другой путь. – LPs

-1

Как это

void nextGeneration(int **board) { 

int editBoard[row][col]; 
    ... 
    displayBoard(editBoard); 
} 

void displayBoard(int board[][col]) { 
     ... 
} 
+0

Его работа над моей системой. Его также одно из перечисленных решений от Влада из Москвы отвечает – user3853544

+0

Извините, я неправильно понял. – HolyBlackCat

2

Массив передается функция неявно преобразуется в указатель на свой первый элемент.

Так что, если такой массив как

int editBoard[row][col]; 

передается функции в качестве аргумента он преобразуется в тип int (*)[col]. Типы int(*)[col] и int ** - два несовместимых разных типа.

Если компилятор поддерживает массивы переменной длины, то вы можете объявить функцию как

void nextGeneration(size_t row, size_t col, int board[row][col]); 

или

void nextGeneration(size_t row, size_t col, int board[][col]); 

или

void nextGeneration(size_t row, size_t col, int (*board)[col]); 

Эти три заявления объявить ту же одну функцию.

Если компилятор не поддерживает VLA, но значение col определяется как константа (с использованием #define или перечислителя), то вы снова можете использовать эти объявления.

Другой подход - интерпретировать массив, используемый в качестве аргумента как одномерный массив. В этом случае вы можете объявить функцию как

void nextGeneration(int *board, size_t row, size_t col); 

и передать массив как

nextGeneration((int *)editBoard, row, col); 
Смежные вопросы