Функция не изменяет элементы массива

Есть двумерный динамический массив. Мне нужно, чтобы цикл прошел по всему массиву, при этом останавливался на требуемый мне элементах и применял функцию, которая изменяет рандомно либо следующий элемент в строке, либо следующий элемент в столбце. Но он не делает вообще ничего. При этом, если я меняю в функции i + 1 и j + 1 на i - 1 и j -1 (i и j - счетчики в цикле, координаты в массиве), она начинает работать, но не делает то, что мне нужно.

#include <ctime>
#include <iostream>
using namespace std;

int change(int **array, int i, int j, int x, int r) {
    bool ch = false;
    if ((i == x - 2) || (j == x - 2)) {
        if ((i == x - 1) && (j == x - 2)) {
            ch = true;
        }
        if ((ch == false) && (i == x - 2)) {
            array[i][j + 1] = 0;
            ch = true;
        }
        if ((ch == false) && (j == x - 2)) {
            array[i + 1][j] = 0;
            ch = true;
        }
    }
    if (ch == false) {
        if (r == 0) {
            array[i + 1][j] = 0;
        }
        else {
      array[i][j + 1] = 0;
        }
    }
    return 0;
}

int main() {
    setlocale(LC_ALL, "rus");
  srand(time(0));
    int x, y;
    cin >> x;
    while ((x % 2 == 0) || (x <= 5)) {
        cout << "введите нечетное число, большее 5" << endl;
        cin >> x;
    }
    y = x;
    int **array = new int *[x];
    for (int i = 0; i < x; i++) {
        array[i] = new int[y];
    }

    for (int i = 0; i < x; i++) {
        for (int j = 0; j < x; j++) {
            array[i][j] = 1;
            if ((i % 2 == 1) && (j % 2 == 1)) {
                array[i][j] = 0;
        int r = rand() % 2;
                change(array, i, j, x,r);
            }
        }
    } 

    for (int i = 0; i < x; i++) {
        for (int j = 0; j < x; j++) {
            cout << array[i][j] << ' ';
        }
        cout << endl;
    }

    return 0;
}

Ответы (1 шт):

Автор решения: Zhihar

Вообще у вас заполнение массива и его последующее изменение сделано в одном цикле, когда часть элементов еще не инициализировано/заполнено

for (int i = 0; i < x; i++) {
    for (int j = 0; j < x; j++) {
        array[i][j] = 1;
        if ((i % 2 == 1) && (j % 2 == 1)) {
            array[i][j] = 0;
    int r = rand() % 2;
            change(array, i, j, x,r);
        }
    }
} 

Разделите эти 2 этапа

// заполняем массив
for (int i = 0; i < x; i++) {
    for (int j = 0; j < x; j++) {
        array[i][j] = 1;
        if ((i % 2 == 1) && (j % 2 == 1)) {
            array[i][j] = 0;
        }
    }
}

// модифицируем массив
for (int i = 0; i < x; i++) {
    for (int j = 0; j < x; j++) {
        if ((i % 2 == 1) && (j % 2 == 1)) {
            int r = rand() % 2;
            change(array, i, j, x, r);
        }
    }
}

P.S.

ну и вообще по коду -

  1. вы сначала пишите, что вы хотите от пользователя, а то у вас ввод ожидается без каких либо надписей

вместо

cin >> x;
while ((x % 2 == 0) || (x <= 5)) {
    cout << "введите нечетное число, большее 5" << endl;
    cin >> x;
}

лучше

do {
    cout << "введите нечетное число, большее 5" << endl;
    cin >> x;
} while ((x % 2 == 0) || (x <= 5));
→ Ссылка