我一整天都在想这件事…
到目前为止,我所拥有的代码按计划工作,我的想法是,我必须改变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来编译代码
轻松。
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
。