Почему моя переменная принудительно инициализируется в 0, даже если это не так? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь посчитать и обновить соседей ячейки с ненулевыми значениями. Так что слева, справа, сверху, снизу, сверху слева ... В любом случае все восемь направлений и сама клетка.

int grid[100][100];

int genNeibrs(int x, int y, int n, int m)
{
    m--;
    n--;
    int c = 0, xs = ((x - 1) < 0) ? 0 : (x - 1),
        xe = ((x + 1) > n) ? n : (x + 1),
        ys = ((y - 1) < 0) ? 0 : (y - 1),
        ye = ((y + 1) > m) ? m : (y + 1);

    for (auto i = xs; i <= xe; i++)
    {
        for (auto j = ys; j <= ye; j++)
        {
            if (grid[i][j])
                ++c;
        }
    }
    return c;
}

void getGrs(int n, int m)
{
    for (auto i = 0; i < n; i++)
    {
        for (auto j = 0; j < m; j++)
            if (grid[i][j])
            {
                int q = genNeibrs(i, j, m, n);
                if (q)
                    grid[i][j] = q;
            }
    }
}

Здесь значение q становится 0 для последовательных итераций, отличных от 0,0 для grid = {{1, 0, 1, 1, 0, 1, 1, 1, 1, 0 <repeats 91 times>}, {0, 0, 0, 1, 0, 1, 0, 0, 1, 0 <repeats 91 times>}, {0 <repeats 100 times>} <repeats 98 times>}, m и n равны 9 и 2 соответственно. При отладке с помощью gdb функция genNeibrs возвращается, как и ожидалось, но после выполнения мне удалось зафиксировать ее в строке, где инициализируется q. Он как-то инициализируется до нуля, даже если не должен. Так что я делаю не так? Ожидаемое значение grid = {{1, 0 ,3 ,3 ,0, 3, 4, 5, 3, 0 <repeats 91 times>},{0, 0, 0, 3, 0, 3, 0, 0, 3, 0 <repeats 91 times>}, {0 <repeats 100 times>} <repeats 98 times>} В любом случае значения сетки не меняются.

1 Ответ

0 голосов
/ 10 января 2019

Прежде всего, когда вы отлаживаете, вы должны перейти к проблемной функции, чтобы увидеть, что там происходит не так. Однако, так как я обнаружил подозрительный код при поиске типичных опечаток для тех, кто использует ваш загадочный стиль кодирования: сравните следующие строки.

int genNeibrs(int x, int y, int n, int m)
int q = genNeibrs(i, j, m, n);

Скажите, что должно произойти, если вместо "m и n равны 9 и 2 соответственно", у вас будет "m и n равны 2 и 9 соответственно"?

Урок: Используйте значимые имена переменных! Буквы "m" и "n" визуально похожи. Гораздо легче определить, что «строки» и «столбцы» обращены вспять, чем «m» и «n».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...