04:47
Лишняя строчка
Поступает от пользователя жалоба, что не работает одно из измерений. Открываю исходный код в нужном месте. Вижу там такое:
/*if(module_installed)
{
//...
}*/
if(module_installed)
//так, это я отключаю
if(data_value>data_max)
{
//...
}
Отступы были везде одинаковые. Но это была лишь видимость. Если приглядеться, то становится видно, что иф, который про данные, вложен в иф, который про модуль.
На приборе модуль установлен не был. Поэтому алгоритмическая часть, которая про данные, просто не вызывалась.
Раньше жалоб не было, потому что модуль всегда был установлен, и условие всегда проходило. Но в этот раз модуль был отключён. И вот результат.
Но эта ошибка -- не ошибка выставления отступов и не ошибка пропущенного кода. Наоборот. Покопавшись в репозитории я выяснил, что один из блоков кода был закомментирован за ненадобностью (здесь он приведён первым). Но его первую строчку я почему-то продублировал сразу после комментария.
/*if(module_installed)
{
//...
}*/
if(module_installed)
//так, это я отключаю
if(data_value>data_max)
{
//...
}
Отступы были везде одинаковые. Но это была лишь видимость. Если приглядеться, то становится видно, что иф, который про данные, вложен в иф, который про модуль.
На приборе модуль установлен не был. Поэтому алгоритмическая часть, которая про данные, просто не вызывалась.
Раньше жалоб не было, потому что модуль всегда был установлен, и условие всегда проходило. Но в этот раз модуль был отключён. И вот результат.
Но эта ошибка -- не ошибка выставления отступов и не ошибка пропущенного кода. Наоборот. Покопавшись в репозитории я выяснил, что один из блоков кода был закомментирован за ненадобностью (здесь он приведён первым). Но его первую строчку я почему-то продублировал сразу после комментария.
15.09.2023 в 08:59
если какая-нибудь крыса в коде заменит c на кириллическую с, как долго придется искать ошибку?
15.09.2023 в 11:58
Если поддерживает, то ситуация сложнее. Однако, если ты уже пару раз в жизни сталкивался с проблемой замены с на c, то вычислишь шпиона довольно быстро, т.к. всё равно будут показываться ошибки, но странные. Например, о необъявленном идентификаторе, а ты смотришь и такой -- "да вот же он!"
Гораздо хуже ситуация в некоторых интерпретируемых языках, там где отсутствие объявления переменной не является ошибкой. В некоторых случаях у тебя могут образоваться две переменные с одинаковыми на вид именами, но без синтаксических ошибок. Там можно будет искать ошибку долго...
15.09.2023 в 12:58
а это частый случай?
15.09.2023 в 15:32
Может быть, что ты в одном месте переменную называешь, допустим, data_size, а в другом size_data. По ошибке. Ты имел ввиду одну и ту же сущность, но назвал по разному. Ну и начинаешь присваивать и считывать и обнаруживаешь, что присвоенного значения в нужном месте нет. Потому что оно в другой переменной.
15.09.2023 в 16:57
Гораздо хуже ситуация в некоторых интерпретируемых языках, там где отсутствие объявления переменной не является ошибкой.
часто ли такое случается, или сегодня почти везде среда разработки подсказывает, в какой строке подстава
15.09.2023 в 17:08
Гораздо хуже ситуация в некоторых интерпретируемых языках, там где переменные объявлять не только не надо, но и нельзя.
В этих языках переменные создаются при первом присваивании. Это и есть "как бы" объявление. Синтаксис, специально предназначенный для объявления переменных, отсутствует. Поэтому никакую ошибку найти нельзя. Её нет.
Есть утилиты, называемые "статические анализаторы кода". Они просматривают текст программы и ищут "подозрительные" места, которые не являются синтаксическими ошибками. Они помогают как раз искать такие странные логические ошибки. К сожалению, я не знаю, есть ли такие утилиты для питона. Я знаю только про утилиты для Си и Си++, но там нет проблем с объявлениями.
15.09.2023 в 17:29