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