Как вернуть матрицу (2D-массив) из функции? (С)

Я создал функцию, которая генерирует бинго-доску, и я хочу вернуть бинго-доску.

как я и не ожидал, это не сработает.

вот функция:

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

У меня ошибка компиляции (красная сублиния) на линии «возврат платы».

есть способ вернуть 2D-массив без использования structs \ dynamic allocations?

Я использую Microsoft Visual C ++ Express 2010.

Кто-то должен владеть памятью этой доски где-то , и что еще более важно, что собственность должна вернуться к вызывающей стороне этой функции. Без динамического распределения ваша единственная реальная альтернатива заключается в том, чтобы отправить ее в функцию, как в параметр 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() . В идеале он никогда не должен быть в какой-либо потенциально повторяющейся функции, и должен быть гарантирован только один раз за выполнение процесса. (примечание: я честно не помню, если это один раз для выполнения streamа , но на данный момент в вашей кривой обучения кодированию я предполагаю, что multithreading еще не включена в радар).

Наконец, ваш цикл произвольного заполнения бесполезен для повторения. Существуют лучшие альтернативы, генерирующие то, что вы, по-видимому, пытаетесь сделать: создать произвольную перестановку существующего набора чисел. Как написано, вы можете в течение некоторого времени MAX_RANGE эти последние несколько слотов, в зависимости от того, насколько больше MAX_RANGE сравнивается с (N*M) .

Вы определили board как локальную переменную – ее память связана с тем, что функция выходит за frameworks.

Вы можете объявить плату глобальной или создать ее динамически следующим образом:

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