Изменение фиксированного двумерного массива на размер, заданный во время выполнения - PullRequest
1 голос
/ 29 сентября 2011

Я пытался обернуть голову вокруг этого весь день ...

Код, который у меня есть, работает так, как запланировано, идея в том, что мне придется изменить tCell * cells[3][5];взять размер, указанный во время выполнения.Какие изменения мне нужно внести, чтобы сохранить функциональность?

typedef struct {
  int active;

} tCell;

typedef struct {
  tCell * cells[3][5];

} tGrid;

// creates a grid and initialize all the cells to NULL
tGrid *init_grid()
{
  tGrid *grid= malloc(sizeof(tGrid));

  if(grid == NULL)
      exit(127); // failed to malloc

  int i, j;
  for(i=0; i < 3; i++)
    for(j=0; j < 5; j++)
      grid->cells[i][j]= NULL;

  return grid;
}

// adds a cell to the grid
void add_cell(tGrid *grid)
{
    tCell cell;

    int y = rand() % 4;

    if(grid->cells[0][y] != NULL)
        exit(127); // cell is taken

    cell.active = 1;
    grid->cells[0][y] = &cell;
}

void remove_cell(tGrid *grid, int x, int y)
{
    if(x < 0 || x > 3 || y < 0 || y > 5)
        exit(127); // out of bounds

    grid->cells[x][y]= NULL;
}

В основном, init_grid должен будет принять x и y в качестве параметров:

tGrid *init_grid(int x, int y);

Нотогда как я могу изменить определение структуры tGrid?Все, что я до сих пор пробовал, приводило к ошибке компилятора (например, tCell * cells[][];)

В слегка связанной заметке, как вы читаете "tCell * cells[3][5];" вне себя?

Примечание:

  • это вопрос C
  • Я использую gcc 4.1 для компиляции кода

1 Ответ

3 голосов
/ 29 сентября 2011

Легко.

typedef struct {
  int rows;
  int columns;
  tCell **cells;
} tGrid;

И выделение:

tGrid *pGrid = (pGrid*)malloc(sizeof(tGrid));
/* check results etc */
pGrid->rows = rows;
pGrid->columns = columns;
pGrid->cells = (tCell**)malloc(sizeof(tCell*)*rows);
/* check results */
do{
    pGrid->cells[rows-1] = (tCell*)malloc(sizeof(tCell)*columns);
    /* check results */
} while (--rows);

Готово.

Или вы также можете сделать:

typedef struct {
  int rows;
  int columns;
  tCell *cells;
} tGrid;
/*****whatever in the middle ***********/
pGrid->cells = (tCell*)malloc(sizeof(tCell)*rows*columns);

вместо цикла do-while.Разница в том, что в первом случае каждая строка будет отдельным массивом в памяти, что может быть полезно при обработке вещи.

Конечно, в конце для каждого malloc должно бытьбыть free.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...