Главная страница

Форум: "Потрепаться";
Текущий архив: 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];

Наверх

Top.Mail.Ru     Яндекс.Метрика













Память: 0.88 MB
Время: 0.073 c
1-26599
sndanil
2003-05-27 16:14
2003.06.09
Drag&Drop


14-26723
panov
2003-05-22 10:54
2003.06.09
Менеджер памяти от Борланд


14-26696
Vitalik
2003-05-25 08:22
2003.06.09
Package


1-26538
kamkad3e
2003-05-26 22:43
2003.06.09
параметры к WordApplication1.Documents.Open


14-26672
k-man
2003-05-24 09:54
2003.06.09
Glut 3.7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский