Pull to refresh

Comments 13

В конце второй строки присваивания (в «Проект Qt, язык C++») действительно должно быть умножение?
(Как-то размерность не сходится.)
static ShiftResult shift(....)
{
  ....
  qreal l = (orig->x1 - orig->x2)*(orig->x1 - orig->x2) +
            (orig->y1 - orig->y2)*(orig->y1 - orig->y1) *  // <-- Здесь
            (orig->x3 - orig->x4)*(orig->x3 - orig->x4) +
            (orig->y3 - orig->y4)*(orig->y3 - orig->y4);
  ....
}
Зато единороги новые и хорошие, я считаю…
Ошибка здесь:
if      (CAN_FIFO0 == fifo_number){
....
}else if(CAN_FIFO0 == fifo_number){

А что насчёт этого?
    val = (uint8_t)(CAN_RFIFO0(can_periph) & CAN_RFIFO_RFL0_MASK);
...
    val = (uint8_t)(CAN_RFIFO1(can_periph) & CAN_RFIFO_RFL0_MASK);

Точно ли второй & должен быть с 0-й маской?
А вот тут, в исправлении:
Правильно:
const Numeric *const num2 = o1.as<Numeric>();

разве не должно быть
const Numeric *const num2 = o2.as<Numeric>();
?
Да. Я тоже накопипастил. :) Спасибо.
>>или если эти числа содержатся в именах переменных
Не стоит так драматизировать. Присвоение индексов переменным нормальный процесс. Главное понимать зачем и что делаешь. Выдумывание «уникальных» и «хороших» смысловых имён работает только если в классе 10 переменных и функций. После этого фантазия заканчивается. Потом пытаешь работать с рефакторингом. Потом забиваешь.

P.S.
У меня есть проект. Там несколько классов от 200 до 500 переменных. Имена придумывали постановщики, потому что идёт обмен данными с их системой. _01, _02, _15 норма. Бывает круче — ...name_01_name_01, ...name_01_name_02, ...name_02_name_01, и т.д. Со временем привыкаешь. А ведь их ещё нужно вытаскивать в web-клиента. Тут вообще дофига правил о «хорошем» коде не работают в принципе.
Ближайшая аналогия — самолёт. Почему вы можете сложить бумажный самолёт из бумаги и он полетит, а сложить такой же самолётик, но длиной 100 метров уже не получится?

Да, нужно стремиться к хорошему оформлению, наименованию и прочее, но задача не обязана подстраиваться под правила хорошего тона.
Нет никакого драматизма. Это просто экскурсию в мир ошибок. Многие уверены, что у них то ошибки о-го-го какие и никакие инструменты, правила хорошего тона не помогут. Ан нет, множество ошибок именно вот такие. И подобные статьи возвращают с небес на землю :).
>>множество ошибок именно вот такие
Совершенно согласен. Но тут как в каламбуре — если отладка является процессом исправления ошибок, то программирования — процессом их внесения.
Intellisence, например, может мешать. Раньше (когда его ещё не было) я свои переменные наизусть знал. А теперь… Обидно даже. Раньше выдумываешь имя переменной. Основательно, со смыслом, чтобы и выражение с этой переменной как стих читалось. А теперь… Пять минут назад придумал имя переменной. Чёрт! В каком классе? Как я её вообще назвал?! Как я назвал объект, в котором мне нужно было это новое свойство? Вот из таких перманентных самовопросов во время написания кодов и устаёшь чертовски. И… допускаешь ошибки. )))

Один из способов избежать ошибок с именами или индексами — вовсе их не использовать. Например, задача с сортировкой в Java реашается так:


    List<ServiceInstance> getAllInstancesOrdered() {
        List<ServiceInstance> list = new LinkedList<>(instances.values());
        list.sort(Comparator.comparing(ServiceInstance::getWorkerIdentity));
        return list;
    }

Даже если критериев сравнения несколько, то так:


        list.sort(Comparator.comparing(ServiceInstance::getWorkerIdentity)
                .thenComparing(ServiceInstance::getSomeValue));

Вместо создания массивов/списков по индексу в нормальных языках должны быть конструкты для написания именно списка (listOf("aa", "bb", "cc)).

Проект OpenCV, язык C++
bool Jpeg2KDecoder::readHeader()
{
....
cmptlut[0] = ....
cmptlut[1] = ....
cmptlut[2] = ....
if( cmptlut[0] < 0 || cmptlut[1] < 0 || cmptlut[0] < 0 )
result = false;
....
}


Прям чувствуется, как выражение cmptlut[0] < 0 было дважды размножено копированием, но поправили ноль только в одном месте.

Фикс сделали 7 лет назад: https://github.com/opencv/opencv/commit/e87355463f27702f5c398b22b05021f8290e5329

Так и моя статья, описывающая эту ошибку, вышла 7 лет назад. Думаете с тех пор ошибки, допускаемые программистами, принципиально изменились? :)
Хорошо когда IDE может подсвечивать одинаковые слова, при выделении одного из них, как это делается в Notepad++, не все IDE это могут делать, из-за этого приходится открывать один и тот же файл и VS2010 и Notepad++. Хотя новые студии тоже могут подсвечивать.
Короче, эти баги именно из-за этого происходят, что нет такой подсветки. Ну и лучше индексами не пользоваться, если можно использовать именованные члены структуры, x,y,z! Хотя и тут могут быть опечатки(у меня были).
Очень полезная статья!
Избавляет от ощущения, что это только у меня подобные глупые ошибки бывают :)
Sign up to leave a comment.