如何从函数返回矩阵(2D数组)?(C)

如何从函数返回矩阵(2D数组)?(C),c,function,multidimensional-array,C,Function,Multidimensional Array,我创建了一个生成宾果棋盘的函数,我想返回宾果棋盘 正如我没有预料到的那样,它不起作用 以下是函数: 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;

我创建了一个生成宾果棋盘的函数,我想返回宾果棋盘

正如我没有预料到的那样,它不起作用

以下是函数:

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;
}
int**generateBoard(){
int板[N][M],i,j,fillNum;
布尔存在=真;
//初始化种子
srand(时间(空));
//填满。。
对于(i=0;i
我在“返回板”行有一个编译错误(红色子行)

是否有方法使用structs\dynamic allocations在不使用的情况下返回二维数组


我使用微软Visual C++快件2010。

< P>某人必须拥有某个内存的某个位置,更重要的是,所有权必须扩展回这个函数的调用方。在没有动态分配的情况下,您唯一的其他实际选择是将其作为in/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;
                }
            }
        }
    }
}
<>我也会考虑重新定位<代码> sRAND()/CUD>调用<代码>主()/<代码>中的启动代码。理想情况下,它不应该位于某些可能重复调用的函数中,并且应该保证每次进程执行时只执行一次。(注意:我真的不记得它是否是每个线程执行一次,但在您的编码学习曲线中的这一点上,我猜多线程还没有出现在雷达上)


最后,您的随机填充循环是不必要的重复。有更好的替代方案来生成您显然想要做的事情:创建一组现有数字的随机排列。如前所述,您可以旋转一段时间,尝试填充最后几个插槽,这取决于
MAX_RANGE
(N*M)

相比要大多少,您将
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;
}
int**allocate_板(int行,int列)
{    
//分配行,每行都是指向int的指针
int**board=(int**)malloc(行*大小(int*));
int行;
//为每行分配Cols int
对于(行=0;行<行;行++){
板[row]=(int*)malloc(Cols*sizeof(int));
}
返回板;
}
您需要动态释放电路板:

// 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);
 }
//必须提供行数
无空隙板(整块**板,整块行)
{
int行;
//每行先放
对于(行=0;行<行;行++){
自由(板[行]);
}
//最终释放指向行的指针的内存
免费(膳宿);
}
int**setMatrix(int*row1,int*cols1)//返回矩阵
{
int row,cols;
int**矩阵;
printf(“输入行:\n”);
scanf(“%d”行和第行);
printf(“输入列:\n”);
scanf(“%d”、&cols);
矩阵=(int**)calloc(cols,sizeof(int*);

对于(int i=0;i使用malloc进行板2D数组分配,我不能,这是家庭作业..如果我可以,我会这样做..你会更好。现在你返回的局部变量在退出函数作用域时不再有效。它的未定义行为。in-out参数可接受吗?不,因为我们还没有学习指针。(尽管我学习了..).无论如何,在函数中这样做不是必需的。我只是想更清楚一点。.这个函数只调用过一次吗?你学过
静态
关键字了吗?
// 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);
 }
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;
 }