Я работаю над исследовательским проектом на 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);
}
}
}