我创建了一个生成宾果游戏板的函数,我想返回这个宾果游戏板。
如我所料,不起作用。
函数如下:
int** generateBoard() {
int board[N][M], i, j , fillNum;
Boolean exists = True;
// initilize seed
srand(time(NULL));
// fill up..
for(i = 0; i < N; ++i) {
for(j = 0; j < M; ++j) {
exists = True;
while(exists) {
fillNum = rand()%MAX_RANGE + 1; // limit up to MAX_RANGE
if(beenAdded(board, fillNum) == Exist) {
continue;
} else {
board[i][j] = fillNum;
exists = False;
}
}
}
}
return board;
}
我有一个编译错误(红色子线)在"return board"行。
是否有办法返回一个二维数组没有使用结构体动态分配?
我用的是Microsoft Visual c++ Express 2010
您将board
定义为一个局部变量-当函数超出作用域时,它的内存将被释放。
你可以声明全局的board,或者你可以动态地创建它,像这样:
int **allocate_board(int Rows, int Cols)
{
// allocate Rows rows, each row is a pointer to int
int **board = (int **)malloc(Rows * sizeof(int *));
int row;
// for each row allocate Cols ints
for (row = 0; row < Rows; row++) {
board[row] = (int *)malloc(Cols * sizeof(int));
}
return board;
}
你需要动态地释放这块板:
// you must supply the number of rows
void free_board(int **board, int Rows)
{
int row;
// first free each row
for (row = 0; row < Rows; row++) {
free(board[row]);
}
// Eventually free the memory of the pointers to the rows
free(board);
}
必须有人拥有该板的内存,更重要的是,所有权必须扩展回该函数的调用者。如果没有动态分配,你唯一真正的选择就是把它作为in/out参数发送到函数中。
void generateBoard(size_t N, size_t M, int board[N][M])
{
int i, j , fillNum;
Boolean exists = True;
// initilize seed
srand(time(NULL));
// fill up..
for(i = 0; i < N; ++i) {
for(j = 0; j < M; ++j) {
exists = True;
while(exists) {
fillNum = rand()%MAX_RANGE + 1; // limit up to MAX_RANGE
if(beenAdded(board, fillNum) == Exist) {
continue;
} else {
board[i][j] = fillNum;
exists = False;
}
}
}
}
}
并像这样从调用者调用:
int main()
{
const size_t N = 10;
const size_t M = 10;
int board[N][M];
generateBoard(N,M,board);
...
}
我还会考虑将srand()
调用重新定位到main()
中的启动代码。理想情况下,它不应该出现在一些可能重复调用的函数中,并且应该保证每个进程执行一次。(注意:老实说,我不记得是不是每个线程执行一次,但是在你的编码学习曲线中,我猜多线程还没有出现在雷达上)。
最后,你的随机填充循环是不必要的重复。有更好的替代方案来生成您显然想要做的事情:对现有的一组数字创建一个随机排列。如前所述,您可以旋转一段时间来尝试填充最后几个插槽,这取决于MAX_RANGE
与(N*M)
相比有多大。
int **setMatrix(int *row1, int *cols1) //return matrix
{
int row, cols;
int **matrix;
printf("enter row:n");
scanf("%d",&row);
printf("enter cols:n");
scanf("%d",&cols);
matrix=(int **)calloc(cols ,sizeof(int*));
for(int i=0;i<cols ;i++)
{
matrix[i]=(int *)calloc(row ,sizeof(int));
}
*row1=row;
*cols1=cols;
return matrix;
}
int main()
{
int row ,cols;
int **matrix;
matrix=setMatrix(&row, &cols); //get the matrix back
return 0;
}