forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Болтовня (http://forum.boolean.name/forumdisplay.php?f=25)
-   -   Простейшие ошибки, отнявшие много времени (http://forum.boolean.name/showthread.php?t=19610)

impersonalis 30.12.2014 23:30

Простейшие ошибки, отнявшие много времени
 
Расскажите про особые (см. далее) ошибки в коде, которые вы допускали. Ошибка должна отвечать двум качествам: она проста*, но трудноуловима**.

* - т.е. её возникновение не результат неоднозначного портирования, не следствие артефактов уровня аппаратного интерфейса, не результат ошибок в упрощении громоздких условий или вычислении констант, не итог запутывания в простыне кода, который в принципе невозможно удержать в голове. Ошибка вовсе не кажется таковой, т.к. в некотором смысле действительно описывает реализацию алгоритма, и, если тот не был, заранее продуман, то прочтённый ошибочный код увлекает, затуманив восприятие своей простотой.

** - в силу вышесказанного, ошибка раз за разом ускользает при чтении, отводя подозрения от своего простого окружения на более сложные конструкции.

Давно хотел создать этот тред, и поместить в нём старенький участок кода:
Код:

Dim DataTable$(0,0)
;...
Function GetMinInCol#(ID%)
        Local MinV#=DataTable(1,ID)
        Local i%
        For i=2 To DataTableRows
                If DataTable(i,ID)<MinV
                        MinV=DataTable(i,ID)
                EndIf
        Next
        Return MinV
End Function

Код в своё время менялся там сям, пока не стал вот таким. Ошибок синтаксических нет - работает странно (не так, как ожидается, исходя из имени функции).
//старожилы помнят, что я как-то уже упоминал об этой ловушке

прим: команда dim от n выделит память под (n+1) элемент массива, и позволяет индексировать их как с нуля, так и с единицы (как будет принято в соглашении). Так что - ошибка не в индексах.

Harter 31.12.2014 10:48

Ответ: Простейшие ошибки, отнявшие много времени
 
Импер, как актуально.

Unity, С#. Четвёртая ночь без сна. Портирую относительно здоровенный проект с серверной частью на Flash (не то, чтоб я некрофил - это причуды заказчика). Пофиксить compile/post processing errors в связи со switch'ем на другую платформу, понатыкать platform define'ов и разных специфических для платформы workaround'ов (в т.ч. переписать половину "не поддерживаемых" во Flash .NET фич) - это, как оказалось, всего 20% работы/времени. Остальные 80% - это лютый, неистовый, бессмысленный и беспощадный дебаг в самописную "консоль" в виде текстового поля в canvas'е (только хардкор!). В голове крутилось ехидливое "Build once, run everywhere" (ога, если бы...). Дело в том, что понять, что что-то сломалось можно только в runtime непосредственно в билде. При этом "отваливаются" совершенно рандомные, базоыве/простые методы без каких либо признаков (ни error'а, ни exception'а). Например, я совсем не ожидал такого предательства от ToString():
ToString() - работает, ToString("N0") - ВСЁ, код дальше не выполняется. Просто не выполняется и всё тут. То есть Flash как бы говорит мне: "Счастливого дебага, сука!"

Или вот сегодняшняя ночь:
Перепробовать все JSON парсеры для C#
@
Узнать, что ни один не совместим с Flash'ом
@
Полностью переписать тот, который уже используется в проекте (сохранив интерфейс так, чтобы не переписывать все обращения к нему)
@
Сбилдить
@
Охренеть от результата (вкратце, строка "a" == "5755", а строка "e" == "115101115115105111110671111111107105101")
@
Долго ломать голову что это за кодировка/шифр и экспериментировать, в итоге обломавшись
@
Отрефакторить всё так, чтобы избежать использования перегрузки операторов и неявных преобразований, т.е. сделать отдельную обработку для каждого типа данных
@
Снова получить неведомые шифры, но уже разглядеть в них ASCII коды вместо символов
@
Реплейснуть 7 строк вызовом нового метода в одну строку (char to string)
@
Осознать, что всё бы работало и так если бы я догадался сделать последний шаг в САМОМ НАЧАЛЕ
@
Улететь в космос от мощности, сопоставимой со взрывом атомной бомбы, создавшейся в результате взрыва чуть ниже пояса

Ну и таких кейсов овер9000. Если выживу (читать: высплюсь), может напишу статейку. *Ушёл портировать дальше.*

ABTOMAT 31.12.2014 12:12

Ответ: Простейшие ошибки, отнявшие много времени
 
Раз уж вспомнили про флеш.

(Хитро щурясь, засмаливая папироску и поглаживая окладистую бороду)
Дело-то было в бородатые времена, когда я работал ещё в X, Internet Explorer 6 ещё был куда как в моде, и никакого интересного интерфейсу на ём сделать было решительно нельзя: куда ему там до современного CSS3, он даже с блочной моделью был не в ладах: чуть пёрднешь, и всё развалится. В то же время просмотр сайтов с мобилок в моду ещё не вошёл, а потому можно было себе это позволить. В-общем, промышляли мы тогда тем, что делали кое-какие элементы интерфейса на флеше.

Запомнился мне случай: стояла задача сделать на флеше некоторое подобие меню, чтобы флеш подгружал xml'ину из сети (в отличие от JSON на XML во флеше есть родной парсер), в которой была информация о пунктах меню, парсил её и формировал, собственно, элементы меню. Сделал я тогда заголовку элемента меню на отдельном символе (по-современному это бы назвали "префаб"), а там шрифт использовался модный. Но нет проблем, выбираем его в списке медии и в свойствах указываем, дескать, ембеддить его в swf'ку с потрохами. Сделал — работает — показуем заказчику — заказчик говорит что шрифт не такой какой он хотел. Да мать-перемать в чём же дело? Меню создаётся? Да. Шрифт элементам указывается? Да. (иначе бы он другой был очевидно). УМВРЧЯДНТ? Ну, УМВР-то потому что шрифт ентот у меня в Винде установлен. Удаляю шрифт из Винды — вот оно, шрифт получился Times New Roman, который там совсем не в тему. Ну, если шрифта не хватает, вместо него TNR ставится. А что ж не так? Вытаскиваю префаб на первый кадр, сую его в рандомное место и пишу в нём "Lorem ipsum". Запускаю. Алилуйя! Вновь создаваемые пункты меню уже имели соответствующий шрифт! Убираю префаб — нет шрифта. Оставляю его, но оставляю все надписи пустыми строками в нём — снова нет шрифта. Пришлось его оставить с надписями, но за пределами кадра, чтобы до него было не добраться. Для верности ещё opacity 0.01 поставить (при 0 снова пропадают шрифты!). Так и пошло в продакшн.

А произошло по моим предположениям вот что: несмотря на то, что шрифту была дана команда эмбеддиться во флешку (на это было указано пальцем и ещё перепроверено), флеш решил побыть умнее меня и рассудил так: раз на кадре надписей этим шрифтом не встречается, значит эмбеддить не будем. Конечно, ему же было невдомёк, что они появятся только после прогрузки XML, вот он мне и проблем доставил изрядно: сначала я не заметил проблему (как ни странно на работе коллеги, работавшие над проектом тоже, потому что у них тоже в системах тот шрифт стоит), и получилось фиаско перед заказчиком, пришлось жопа-в-мыле исправлять. Потом пришлось думать "да что же не так-то мать вашу?!". А потом искать "некостыльный" способ решения проблемы, понять, что его нет да так и запустить в продакшн с костылём (в виде надписи, которую никто никогда не увидит, но которая нужна во имя всевышнего маразма).

И таких случаев было миллион за всё время, пока я работал с флешем. И крупные гадости он устраивал, да и на мелочи тоже не скупился. Например, ту же XML'ину он намертво загонял в кэш, и когда на сервере её содержимое менялось, флеш на это не реагировал (беря ту, что у него в кеше), не помогали ни перезагрузки страниц, ни очистка кеша самого браузера. Ну естественно, ведь флешка на странице — это, строго говоря, и не часть её. У неё там своё государство. Может, если ещё случаев вспомню, то расскажу, давно это было.

Как только появилась возможность отказаться от поддержки IE6, Флеш был послан далеко и надолго вслед за ним. Настолько вот паршиво он реализован. Никогда больше к нему не вернусь, никаких денег у заказчиков на это не хватит :-D Да здравствует jQuery, да здравствует HTML5 и CSS3 ! До сих пор когда вижу где-то на каком-то сайте флеш-части, мне становится противно. Как же хорошо, что iPhone (хоть что-то он полезное сделал) встал рогом и отказался эту гадость поддерживать, в результате Флеш на веб-страницах уже практически сошёл на нет.

AVL 01.01.2015 20:44

Ответ: Простейшие ошибки, отнявшие много времени
 
Делал одно приложение на java, с гуём на swing. Производит некоторые вычисления и выдает результат. Запускаю на тестовых данных, где ответ должен быть ноль. Вижу что-то вроде 2.474257. Другой пример, так же жду ноль, получаю опять 8.757633. Как в итоге оказалось - в текстовом поле не поместилось E-9.

RegIon 01.01.2015 21:11

Ответ: Простейшие ошибки, отнявшие много времени
 
Писал обвязку под МК геодезической установки, которая просто температуру с 2 датчиков снимает, пишет в EEROM и можно UART потом слить их, не в том суть.
Нужно было отправить установку времни: T \r\n HH:MM:SS \r\n Y \r\n , где HH:MM:SS берется из TextBox (WinForm C#), долго искал что не так:
PHP код:

send commandText.ToString().CharAt(); 

исключение не выдает, да и компилятор нормально относится, просто строка типо такого вида получается:
Код:

лалала commadText(TextField), value: "ТЕКСТ"

impersonalis 27.01.2015 00:10

Ответ: Простейшие ошибки, отнявшие много времени
 
2ABTOMAT ненависть! шрифты! предательство!


Часовой пояс GMT +4, время: 17:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot