Страницы: 1 2 3 вся ветка
Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 вся ветка
Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.83 MB
Время: 0.05 c
1-26520           Project111            2003-05-27 17:19  2003.06.09  
Создать документ Word


1-26525           AlexBut               2003-05-27 07:53  2003.06.09  
Enter вместо Tab


1-26486           bkv                   2003-05-29 11:28  2003.06.09  
Передача строки в cообщении WM_COPYDATA


14-26671          Suhomlin              2003-05-24 13:56  2003.06.09  
Взаимодействие с Microsoft Outlook


14-26655          AlexHHH               2003-05-23 16:40  2003.06.09  
Запуск другого приложения на панели моей программы