Форум: "Потрепаться";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизКак тупят программисты? Найти похожие ветки
← →
Real (2003-05-15 20:14) [0]Людям свойственно ошибатся. Предлагаю открыть ветку, где каждый поделится не своей крутизной, а рассказами о своих глюках, когда вроде простая задача решалась длительное время (и какие различные мысли в этот момент приходили). Конечно, рассказывать нужно о тех проблемах, которые в итоге были решены, после чего следовал приступ хохота.
← →
Юрий Зотов (2003-05-15 20:35) [1]Эту ошибку я вылавливал 2 дня
Писал тогда на PL/1. На нем и привожу код, потому что в нем есть специфика именно этого языка. Но с комментариями, чтобы было понятно:
DECLARE
I DECIMAL FIXED(1);
/* то есть, I - целая переменная длиной 1 десятичный знак. */
....
D0 I = 1 TO 9 ...
/* На Паскале это будет так: for I := 1 to 9 do ... */
Аллес. Цикл бесконечный. Пока я локализовал место зацикливания (при тех-то средствах отладки!), пока тупо смотрел и не понимал, почему эта зараза циклится, прошло 2 дня.
После этого был действительно приступ хохота. Но сначала ругани самого себя и самыми последними словами.
← →
Zz_ (2003-05-15 20:44) [2]Почти аналогично Юрий Зотов © (15.05.03 20:35)
for(unsigned short usTmp = 25;usTmp>=0;usTmp--){};
← →
Fredericco (2003-05-15 20:49) [3]В большом участке кода было место, что-то вроде этого:
if b then
DoSome1;
DoSome2;
Чтобы по условию выполнилось 1 и 2 нужны begin и end. А я их не поставил. Сразу оправдываюсь: кода было много, до этого половину дня искал ошибку, время под 23, на работе с 9-00, короче - ступил. Причем я почему-то себе втемяшил что b=True (на самом деле было Ложь), и я не понимал какого фига DoSome1 не выполняется. Даже перед DoSome2 ставил ShowMessage - срабатывало, а DoSome1 не хотел. Бился я около часа. Когда понял что b=False да и begin"бы не помешал, обиделся на себя, нажал Power и пошел домой.
Вот так. :-)
← →
panov (2003-05-15 21:05) [4]Недавний пример:
Несколько дней ушло на решение. Разобрался только после того, как мне в форуме посоветовали.
А проблема была в том, что функция окна не перерисовывала в NT само окно, а в W98 было все нормально.
Функция такого вида:
function MyWndProc(Wnd:HWND;Mess:word;
WParam:word;LParam:LongInt):LongInt;stdcall;
begin
case Mess of
WM_CREATE: Result:=0;
WM_DESTROY:
begin
PostQuitMessage(0);
Result:=0;
end;
else Result:=DefWIndowProc(Wnd,Mess,WParam,LParam);
end;
end;
Несколько дней я пытался разобраться с этим.
В результате проблема была решена заменой типов параметров процедуры...
← →
vuk (2003-05-15 21:18) [5]У нас в текущем проекте распространена ситуация, когда формы реализуют интерфейсы. В одном месте завели пару глобальных переменных интерфейсного типа, которым в какой-то момент присваивается значение, только вот обнуление прикрутить забыли. А вот компилятор финализацию прикрутить не забыл... Искали баг вдвоём где-то часа 3, т.к. сыпалось, вроде как, по абсолютно непонятной причине и далеко не каждый раз. Когда нашли реакция была примерно такая же как у Юрия.
← →
Ihor Osov'yak (2003-05-15 21:23) [6]2 Юрий Зотов © (15.05.03 20:35)
2 Zz_ (15.05.03 20:44)
У ЮЗ красивее :-)...
О себе.. Всего и не вспомнишь.. Но наиболее "больно" было из-за неявной рекурсии..
Да, еще вспомнил.. Совсем недавно.. Матерился потом долго ..
PostMessage(..,Супер_Пурер_CMD,..
Apliсation.ProcessMessages;
Do_Чего_то_там_которое_должны_сделать_до_Обработки_Супер_Пурер_CMD;
← →
Suntechnic (2003-05-15 21:23) [7]>panov ©
Из той же оперы.
В Builder 4 попробуйте объявить конструктор формы__fastcall TForm1(TComponent* Owner);
с параметром int. Что то типа__fastcall TForm1(TComponent* Owner, int index);
При создании объекта данного типа программа просто отвисала(насколько я помню уходила в рекурсию где то в нутрях VCL). А вот замена параметра на тип long решала проблему.
Но я, скорее всего, даже не хохотал, а матерился когда после нескольких часов изысканий выяснилось в чём проблема.
← →
Zacho (2003-05-15 22:17) [8]А весьма интересная и полезная тема :)
Наверное, одна из самых тупых моих ошибок.
Небольшая бухгалтерская программа. В течении нескольких часов пытаюсь понять, почему при вводе новой операции у нее устанавливается какая-то левая дата. Причем все время одна и та же. Причем еще недавно все работало нормально. Много раз протрассировал и перелопатил весь ответственный за это код. Потом стали посещать мысли о каком-то редкостном и странном то ли баге в сервере, то ли нарушении структуры БД. Сделал всевозможные проверки базы, backup/restore и т.п. Бесполезно.
И вдруг вспоминаю, что пару дней назад для какой-то отладки временно сделал триггер, принудительно устанавливающий эту дату. А удалить забыл.
Долго смеялся и матерился одновременно.
P.S. Для не работавших с БД с триггерами. Триггер - это процедура, срабатывающая при вставке/изменении/удалении записи в таблице.
← →
RIMMER (2003-05-15 23:45) [9]У меня на днях случилось...
В юните - 2 процедуры, каждая из которых читает примерно одинаковые ключи из двух разных ini-файлов. Допираете? Читать должны из разных, а кконстанту строковую в обеих установил одну и ту же :)) Полдня потратил, пытаясь разобраться, почему вторая читалка всегда стандартные параметры читает, которые я ей указал...
← →
Style (2003-05-16 01:42) [10]Ужас :)
prope$7A$64ure(TList: List);
end
TObject := Object.Destroy;
finally
Object.Add(TList);
end
TObject.Create;
begin;
begin;
Тфу надеюсь даже с жуткого похмелья такого не напишу :)
Хотя все у нас бывает :)))
← →
Нуу (2003-05-16 03:51) [11]2 Юрий Зотов © (15.05.03 20:35)
А я, если честно, не понял?
Или я не понимаю "/* то есть, I - целая переменная длиной 1 десятичный знак. */"?
← →
АлексейК (2003-05-16 05:16) [12]Стояло у меня 3 языка на компьютере - английский, немецкий и русский. Получилость так, что в одном операторе пара символов была набрана на немецком. От английских они естественно ничем не отличались, а вот компилироваться программа не хотела. Сообщение об ошибки никоим образом не указывало на данный оператор и вообще не вызывало ни каких ассоциаций. Просидел весь вечер, уже начал думать что у крякеров ручки кривые и что такого не может быть, потом стал отключать участки кода и в конце подошел именно к этому опратору, сморел на него еще минут 10, после чего набрал заново и все стало работать.
← →
vidiv (2003-05-16 05:30) [13]Написал так в дельфи 6:
const c1:array[boolean,boolean] of byte = (0,0,0,0);
---Мне сказали что нучно так:
const c1:array[boolean,boolean] of byte = ((0,0),(0,0));
---
Но вышеуказаннвя надпись вызывала у дельфи ошибку в модуле dcc60, я даже дельфи переставлял, не сработало...
Вот это бед!
← →
Думкин (2003-05-16 05:42) [14]У меня недавно при работе с ДиректДроу было.
В одном мечсте применял BltFast c флагом DDBLTFAST_WAIT.
А потом сменил на Blt, но флаг сменить на DDBLT_WAIT забыл.
Результат был печальный - на огромном числе компов все шло пучком, а на одном нет. Причем этот комп был далеко - пришлось повозится чтобы локализовать проблему, и даже когда локализовал - 15 минут тупо смотрел и никак не мог врубиться - нашел только когда закоментил и начал набирать заново.
← →
ZeroDivide (2003-05-16 08:32) [15]>Нуу (16.05.03 03:51)
>2 Юрий Зотов © (15.05.03 20:35)
>А я, если честно, не понял?
Я тоже не понял какая у этой переменной дисперсия значений :/
Меня тут как то добил стандартный чекбокс вот в таких процедурах,
пришлось так его использовать потому что радиогруп смотрелось не красиво:
Procedure TFm.Cb1clk(Sender: TObject);
begin
cb2.Checked := False;
end;
Procedure TFm.Cb2clk(Sender: TObject);
begin
cb1.Checked := False;
end;
Но самое главное что я тупил, даже поняв в чем причина :)))
← →
gek (2003-05-16 09:28) [16]У меня была ситуация когда минут 15 тупо смотрел на функцию copy
и не понимал - ну почему компилятор ее не видит.
Оказалось, что первую букву на русском ввел.
← →
pasha676 (2003-05-16 09:33) [17]Козырная моя ощибка - пытаюсь связываться с внешним устройством, забыв включить питание устройства :). Иногда минут по десять затмение длиться. Самое интересное, что с хорошей периодичностью это дело повторяется :).
← →
Vint (2003-05-16 09:42) [18]
Даа, после того как несколько дней смотришь один и тот же участок кода и вроде все перепробовал и все по отключал, а ошибка оказывается вот она, на виду, в какойте фигне вырывается не смех а длинный мат :(((
а из приколов которые на всегда врезались в память это на первой работе по пьяне вставлял мать 386 и разломил ее... списали :), а еще опять же по пьяне одевал год назад куллер орб на 866 пенек 3, и соскользнула рука, отверткой содрал слой жилок на метеринке 8 штук и отломил угол у проца... но ничего материнку запоял, проц работал но иногда перегружался сам по себе, я тогда наростил уголок эпоксидкой, подкрасил и заменил по гарантии :))
← →
ПИТОН (2003-05-16 09:52) [19]Я вот однажды в сравнении вместо +1 написал *1.
Так неделю пытался выловить.
← →
NickBat (2003-05-16 10:38) [20]Сила привычки.
Как-то на C++ (или PHP, сейчас уже не помню) написал оператор сравнения
if (s=0) .....
Долго пытался понять почему всегда истина. Самое интересное, что в тексте программы и до этого сравнения, и после написал правильно (==).
← →
Cobalt (2003-05-16 14:00) [21]Сейчас писал для 1С:
Сначала было так:
>>Для СчетчикЦикла = 0 По Корень.КоличествоПодчиненных()-1 Цикл
но ругался на выход за границы. Потом сделал так:
>>Для СчетчикЦикла = 1 По Корень.КоличествоПодчиненных()-1 Цикл
(а количество элементов было 1 :))
долго удивлялся тому, что не проходит по дереву
← →
Юрий Федоров (2003-05-16 14:09) [22]У меня самый страшный случай произошел, когда на совершенно безобидной строке типа Panel1.caption:="" программа валилась.
Думал две недели, оказалось, что в другом модуле в StrCopy забыл выделить память под терминатор (#0)
← →
Marser (2003-05-16 14:37) [23]Всего и не упомнишь, бывают серьёзные глюки, но после минутной истерики всё забывается %-)
← →
Style (2003-05-16 14:51) [24]А недавно случайным образом подключил CLX в Delphi6;
В общем сделал дистрибутивчик отнес прогу клиенту. А там бац и не идет.. Говорит давай сюда библиотеку :(
В общем все облазил ничего не пойму. Ничего не использую давай говорит библиотеку.. Оказывается внутри кода своего компонента случайно тыкнул на клавишу Q перед forms, получилось uses qforms;
А времени блин убил!! Вроде бы компоненты рулят! В коде все чисто а так блин фантастика :))
← →
Dmk (2003-05-16 14:59) [25]Для работы с изображениями создал свой класс. Так в нем использовался указатель для работы со скан-линиями. И выделял
по указателю массив длиною в скан-линию. Выделял всегда размером в ширину изображения.
Класс содержал функции позволяющие делать поворот изображения. Поворачивалось все нормально, но при масштабировании и прорисовке происходили чудеса :) Искал месяц. Зато потом чувство облегчения :)
← →
han_malign (2003-05-16 15:03) [26]>NickBat © (16.05.03 10:38)
>if (s=0) .....
>Долго пытался понять почему всегда истина. ...
- может все-таки ложь???
← →
clickmaker (2003-05-16 15:18) [27]while DS.Eof do begin
...
DS.Next;
end;
Без комментариев.
← →
han_malign (2003-05-16 15:32) [28]последнее, что-то вроде этого ( для наглядности)
Caption:="Label1 deleting";
with Label1 do begin
Free;
Caption:="Label1 deleted";
end;
← →
Игорь Шевченко (2003-05-16 15:35) [29]DS.Open();
try
while not DS.Eof do begin
....на экран кода..
end;
finally
DS.Close()
end;
DS.Next был упущен :)
← →
Vlad Oshin (2003-05-16 15:50) [30]надо было оценить процент неудачных попыток, сравнить с наперед заданным
if (poor/all)<50 then
странно, не работает...
if round(poor/all)*100<0.5 then
странно, не работает...
← →
Ihor Osov'yak (2003-05-16 15:58) [31]2 NickBat © (16.05.03 10:38)
Дык сишники для этого рекомендуют сначала констану писать, а потом переменную:
if (0=s) {
Компилятор бы точно не пропустил :-)
Зы - хотя сам такие ошибки делал несколько раз.. И потом долго искал..
← →
VAleksey (2003-05-16 16:46) [32]Буквально 2-е минуты назад сообразил.
Свежачок:
qryTransCount.SQL.SaveToFile("");
if not qryTransCount.Prepared then qryTransCount.Prepare;
примерно 30 мин. не мог понять почему программа зависает.
Грешил на вторую строку.
Зато запрос оптимизировал немного :-))
← →
SPeller (2003-05-16 16:48) [33]Только что нашёл у себя ошибку, над которой бился ровно 24 часа начиная со вчера. Пишу некое подобие звукового движка к своему курсачу, и при переносе объявлений функций в одной из них забыл проставить stdcall; Всего-то из-за какого-то слова ушли сутки, нервы и бессонная ночь :-))
← →
VAleksey (2003-05-16 16:48) [34]
> Игорь Шевченко © (16.05.03 15:35)
> clickmaker © (16.05.03 15:18)
Ну это вообще классика :-)
← →
icWasya (2003-05-16 18:39) [35]из прошлого века
Fortran
DO I = 1 . 10
MYPROC(I)
10 CONTINUE
всё компилится - а процедура MYPROC выполняется один раз с параметром 0.
в чем дело?
вместо запятой поставлена точка
на распечатке разницу заметить почти невозможно
Фортран пробелы в тексте игнорирует(даже внутри идентификатора)
и переменные описываются неявно - в результате, если превести на паскаль, то правильный код
for I:=1 to 10 do
MYPROC(I);
превратился в
DOI:=1.10;
MYPROC(I);
← →
Song (2003-05-16 20:26) [36]Var D1,D2: Double;
D1:=GetModulePrice; // 1,24
D2:=StrToFloat(Label21.Caption); // 1,24
IF D1=D2 then ImageList1.Draw(...{ зелёная иконка} } else
ImageList1.Draw(...{ красная иконка});
Полчаса не мог допереть почему рисуется красная икока.
← →
Snap (2003-05-18 01:03) [37]JavaScript.
Простой код, обновляющий страницу по таймеру. 3 Часа пытался понять почему каждый раз вылезает ошибка, оказалось скобки в условии не поставил :)))) а в паскале ведь и без скобок работает :))))
В Дельфи часто забываю в reset or rewrite второй параметр задавать, и получается что каждый кусок по 512 байт :))))
← →
DrPass (2003-05-18 10:19) [38]Вчера писал программу (набирать каркас было лень, поэтому просто скопировал generic.pas из сорцов турбо-паскаля):
...
function WindowProc(Window: HWnd; Message, WParam: Word;
LParam: Longint): Longint;
begin
...
И почти час пытался сообразить, почему она зависает?
← →
Malder (2003-05-18 11:58) [39]Юрий Зотов, извините за тупизм, но я тоже не понял, что значит
>I - целая переменная длиной 1 десятичный знак
← →
Юрий Зотов (2003-05-18 12:25) [40]> Нуу (16.05.03 03:51)
> ZeroDivide © (16.05.03 08:32)
> Malder © (18.05.03 11:58)
Это целая переменная с дипазоном 0..9. Особенность компилятора в том, что код контроля переполнения не строится, а вместо этого строится код, "отбрасывающий" старшие десятичные разряды. В итоге получаем: если I=9, то после прибавления еще единицы I будет равно нулю. Отсюда и зацикливание (I никогда не может превысить верхнюю границу цикла).
В PL/1 еще и не такие чудеса были возможны. Например, практически любой тип данных там запросто преобразовывался в практически любой другой тип данных. Штука очень мощная, но и очень опасная. Требует внимательности, аккуратности и полного понимания того, что ты делаешь и как это будет обработано компилятором. Иначе последствия непредсказуемы, а вылавливать подобные ошибки обычно бывает очень непросто.
Страницы: 1 2 3 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.009 c