【问题标题】:How to return matrix (2D array) from function? (C)如何从函数返回矩阵(二维数组)? (C)
【发布时间】:2012-12-14 20:35:08
【问题描述】:

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

因为我没想到,它不起作用。

函数如下:

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。

【问题讨论】:

  • 使用 malloc 进行板二维数组分配,
  • 我不能,这是作业..如果我能,我会这样做..
  • 你更好。现在,您正在返回一个在退出函数范围时不再有效的局部变量。其未定义的行为。输入输出参数可以接受吗?
  • 不,因为我们还没有学习指针。 (即使我做了..)。无论如何,不​​需要在功能上这样做。我只是觉得它更清楚..
  • 这个函数是否只调用过一次?你学会static关键字了吗?

标签: c function multidimensional-array


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    某人必须拥有该板某处的内存,更重要的是,该所有权必须延伸回该函数的调用者。如果没有动态分配,您唯一的其他真正选择是将其作为 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() 中的启动代码。理想情况下,它不应该出现在某些可能重复调用的函数中,并且应该保证每个进程执行只执行一次。 (注意:老实说,我不记得它是否每个 thread 执行一次,但在你的编码学习曲线的这一点上,我猜多线程还没有出现。 p>

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

    【讨论】:

      【解决方案3】:
      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;
       } 
      

      【讨论】:

        猜你喜欢
        • 2014-12-19
        • 2021-03-29
        • 2011-07-09
        • 2023-03-02
        • 1970-01-01
        • 2021-05-01
        • 2021-12-04
        • 2012-01-26
        相关资源
        最近更新 更多