Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Общие темы > Болтовня

Болтовня Разговоры на любые темы (думайте, о чем пишите)

Ответ
 
Опции темы
Старый 30.12.2014, 23:30   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Простейшие ошибки, отнявшие много времени

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

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

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

Давно хотел создать этот тред, и поместить в нём старенький участок кода:
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) элемент массива, и позволяет индексировать их как с нуля, так и с единицы (как будет принято в соглашении). Так что - ошибка не в индексах.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?

Последний раз редактировалось impersonalis, 31.12.2014 в 02:54.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Harter (31.12.2014)
Старый 31.12.2014, 10:48   #2
Harter
Бывалый
 
Аватар для Harter
 
Регистрация: 03.11.2008
Адрес: Украина, Днепропетровск
Сообщений: 871
Написано 554 полезных сообщений
(для 2,520 пользователей)
Ответ: Простейшие ошибки, отнявшие много времени

Импер, как актуально.

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. Если выживу (читать: высплюсь), может напишу статейку. *Ушёл портировать дальше.*
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо Harter за это полезное сообщение:
ABTOMAT (31.12.2014), Arton (31.12.2014), Igor (31.12.2014), impersonalis (31.12.2014), Phantom (01.01.2015), Randomize (31.12.2014), St_AnGer (31.12.2014)
Старый 31.12.2014, 12:12   #3
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Простейшие ошибки, отнявшие много времени

Раз уж вспомнили про флеш.

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

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

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

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

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

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
Arton (31.12.2014), Кирпи4 (01.01.2015), Harter (31.12.2014), impersonalis (31.12.2014), Nex (28.01.2015), Phantom (01.01.2015), Randomize (31.12.2014), RegIon (01.01.2015), St_AnGer (31.12.2014)
Старый 01.01.2015, 20:44   #4
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Простейшие ошибки, отнявшие много времени

Делал одно приложение на java, с гуём на swing. Производит некоторые вычисления и выдает результат. Запускаю на тестовых данных, где ответ должен быть ноль. Вижу что-то вроде 2.474257. Другой пример, так же жду ноль, получаю опять 8.757633. Как в итоге оказалось - в текстовом поле не поместилось E-9.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо AVL за это полезное сообщение:
ABTOMAT (01.01.2015), impersonalis (03.01.2015)
Старый 01.01.2015, 21:11   #5
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Простейшие ошибки, отнявшие много времени

Писал обвязку под МК геодезической установки, которая просто температуру с 2 датчиков снимает, пишет в EEROM и можно UART потом слить их, не в том суть.
Нужно было отправить установку времни: T \r\n HH:MM:SS \r\n Y \r\n , где HH:MM:SS берется из TextBox (WinForm C#), долго искал что не так:
send commandText.ToString().CharAt(); 
исключение не выдает, да и компилятор нормально относится, просто строка типо такого вида получается:
лалала commadText(TextField), value: "ТЕКСТ"
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 27.01.2015, 00:10   #6
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Простейшие ошибки, отнявшие много времени

2ABTOMAT ненависть! шрифты! предательство!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com