繁体   English   中英

如何从函数返回矩阵(二维数组)? (C)

[英]How to return matrix (2D array) from function? (C)

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

正如我没想到的那样,它不起作用。

这是功能:

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;
}

我在“返回板”行有一个编译错误(红色子线)。

有没有办法在使用结构\\动态分配的情况下返回二维数组?

我正在使用 Microsoft Visual C++ Express 2010。

您将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);
 }

有人必须在某处拥有该板的内存,更重要的是,所有权必须扩展回该函数的调用者。 如果没有动态分配,您唯一的其他真正选择是将其作为输入/输出参数发送到函数中。

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;
 } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM