我一整天都试图绕过这个......
到目前为止,我所使用的代码是计划好的,我的想法是我必须更改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];
”?
注意:
答案 0 :(得分:3)
易。
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
。