Невозможно воспроизвести ошибку в отладчике - PullRequest
0 голосов
/ 25 июля 2011

Я работаю над исследовательским проектом на C, использующим Eclipse с CDT, MinGW и GDB для Windows.

У меня есть массив int с элементами, которые должны быть между 0 и 3 (включительно). Я перебираю массив и включаю номер. Я вставил assert (0) в моем случае по умолчанию на случай, если я где-то напутал, и число за пределами моих границ проскользнуло. Теперь этот assert отключается для определенного ввода всякий раз, когда я запускаю свою программу. Хорошо - я где-то напортачил, и тут крадется число за гранью. С этим я могу справиться. Проблема в том, что когда я запускаю программу в отладчике, все работает нормально. Утверждение никогда не срабатывает, результаты получаются правильными, и проблем нет. Меня меньше беспокоит тот факт, что есть ошибка, чем тот факт, что я не могу воспроизвести ошибку во время отладки.

Вот соответствующий код. Каждый% 3 = 0 элемент int * zeroPairs (должен быть) между 0 и 3 (включительно). Следующие два элемента являются индексами в другом массиве и могут быть различными числами. j * 3 не выйдет за пределы нулевых пар. Массивы A, B, C и D содержат только 1 или -1 в каждом индексе. Когда у меня был типичный обмен A = temp, A = B и т. Д., Он работал нормально. Когда я упростил это, просто изменив знак на каждом 1, когда эта ошибка началась.

Спасибо за помощь!

for (j = 0; j < bits; ++j) {
        if (k & (1 << j)) { //Check if a bit is set, if so, swap the correct elements
            switch (zeroPairs[j * 3]) {
            case 0:
                A[zeroPairs[j * 3 + 1]] = -A[zeroPairs[j * 3 + 1]];
                A[zeroPairs[j * 3 + 2]] = -A[zeroPairs[j * 3 + 2]];
                break;
            case 1:
                B[zeroPairs[j * 3 + 1]] = -B[zeroPairs[j * 3 + 1]];
                B[zeroPairs[j * 3 + 2]] = -B[zeroPairs[j * 3 + 2]];
                break;
            case 2:
                C[zeroPairs[j * 3 + 1]] = -C[zeroPairs[j * 3 + 1]];
                C[zeroPairs[j * 3 + 2]] = -C[zeroPairs[j * 3 + 2]];
                break;
            case 3:
                D[zeroPairs[j * 3 + 1]] = -D[zeroPairs[j * 3 + 1]];
                D[zeroPairs[j * 3 + 2]] = -D[zeroPairs[j * 3 + 2]];
                break;
            default:
                printf("Whoops %d", zeroPairs[j * 3]);
                fflush(stdin);
                assert(0);
            }

        }
    }

1 Ответ

3 голосов
/ 26 июля 2011

Отладочные сборки часто работают "правильно", потому что неинициализированные переменные установлены по умолчанию.

Кроме того, доступ из связанного массива и указателя часто не вызывает перезаписи других переменных, так как между элементами есть дополнительное заполнение. У вас все еще есть ошибка в отладочной сборке, но вы можете ее не осознавать.

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