Последняя надежда
Что делать, если вы все перепробовали, но ничего не помогает? Может быть, как раз наступило время взять хороший отладчик и пройтись по программе. Если ваша мысленная модель работы программы по какой-то причине попросту не соответствует действительности и вы смотрите в совершенно другом направлении, чем нужно, или же смотрите в правильном направлении, но в упор не видите проблему, то отладчик заставит вас изменить ход мыслей. Такие ошибки в "мысленной модели" наиболее сложны, и помощь со стороны машины здесь бесценна.
Иногда источник непонимания очень прост: неверный приоритет операторов, неверный оператор, выравнивание, не соответствующее действительной структуре программы, или же ошибка области видимости, когда локальная переменная прячет под собой глобальную или же глобальная переменная вторгается в локальную область видимости. Например, программисты часто забывают, что & и | имеют меньший приоритет, чем == и ! =. Они пишут так:
?if (х & 1 == 0) ?….
И не могут понять – почему результат этого выражения – всегда "ложь". Иногда неверное движение пальца при наборе превращает одиночный символ = в двойной и наоборот:
Или после редактирования случайно остается лишний код:
? for (i=0; i < n; i++); ? a[i++] = 0;
Или проблему создает спешка при наборе текста кода:
Иногда ошибка случается из-за неправильного порядка аргументов в вызове процедуры. Если проверка типов не может помочь, например:
memset(p, n, 0); /* записать п нулей в р */?
Вместо:
memset(p, 0, п); /* записать n нулей в р */
То транслятор такой ошибки не обнаружит.
Иногда незаметно для вас что-то изменяется, например глобальные или общие переменные, а вы об этом ничего не знаете, пока какая-нибудь функция не обратится к ним.