Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Абсолютно необъяснимый глюк


Страницы:   1 2 3

Franzy ©   (2009-04-30 15:05:00) 

Форма. На форме кнопка. По нажатию на кнопку производится обработка заранее подготовленных данных. Нажимаем первый раз - результат правильный. Нажимаем второй раз - результат правильный, причем точно такой же, как в первый раз. Нажимаем третий (четвертый, пятый...) раз - результат неправильный, и обратно каждый раз одинаковый!

Каждый раз входные данные одни и те же. В обработчике кнопки они никак не модифицируются. Только на их основе образуются новые данные. Эти новые данные каждый раз все честно обнуляются. В том числе всем дин. массивам присваиваю := nil.

Как такое может быть?!!!! Я в полном ступоре. Я понимаю, если бы каждый раз результат был разный или всегда одинаковый неправильный. Но тут при первом и втором нажатии результат А, а при всех последующих - результат Б. Ерунда какая-то!

Код очень объемный, поэтому не привожу. З.Ы. Нажатия кнопки в программе тоже никак не считаю. Все переменные, кроме временных и счетчиков, глобальные.


Anatoly Podgoretsky   (2009-05-02 09:01:00) [21]

Тип объявлен на один элемент, и чтобы работать надо выключить проверку диапазонов. А нужды делать на один элемент нет никакой. Эта техника была взята из СИ, где массивов как таковых и не было, и не было проверки диапазонов.


@!!ex   (2009-05-02 08:25:00) [22]

> [21] Anatoly Podgoretsky ©   (01.05.09 23:48)

Почему?


Anatoly Podgoretsky   (2009-05-01 23:48:00) [23]

> @!!ex  (01.05.2009 21:26:18)  [18]

Так делать не надо!


@!!ex   (2009-05-01 21:58:00) [24]

> [19] sniknik ©   (01.05.09 21:35)
> вообще то нет, это не динамический массив

И чем же это НЕ динамический массив? :)
Это не тот динамический массив, что сейчас используется(в основном), но это вполне себе динамический массив.


sniknik   (2009-05-01 21:35:00) [25]

> Вполне законное объявление динамического массива.
вообще то нет, это не динамический массив, это способ каким обходились до того как появились динамические массивы. и насколько помню Range Cjeck для него надо было выключать.
либо "обманывать" типа
type
 TIntArray = array[0..32767] of integer;
 PIntArray = ^TIntArray ;

var
 A:PIntArray ;
begin
 A:=GetMem(sizeof(integer)*1000);


@!!ex   (2009-05-01 21:26:00) [26]

> [16] Anatoly Podgoretsky ©   (01.05.09 20:52)

А как же быть с объявлениями типа:
type
 TIntArray = array[0..0] of integer;
 PIntArray = ^TIntArray ;

var
 A:PIntArray ;
begin
 A:=GetMem(sizeof(integer)*1000);
end;

Вполне законное объявление динамического массива. Но насколько я помню - Range Cjeck не проходит.


Германн   (2009-05-01 21:21:00) [27]


> Anatoly Podgoretsky ©   (01.05.09 20:52) [16]
>
> > KSergey  (01.05.2009 15:42:13)  [13]
>
> Потом, после тестов не снимаем.

+1


Anatoly Podgoretsky   (2009-05-01 20:52:00) [28]

> KSergey  (01.05.2009 15:42:13)  [13]

Потом, после тестов не снимаем.


Sapersky   (2009-05-01 16:57:00) [29]

Ставим галку check range в свойствах проекта

Не-а, не работает. Видимо, это только для статических массивов, защита от переполнения буфера фиксированного размера.


Юрий Зотов   (2009-05-01 15:48:00) [30]

> Германн ©   (01.05.09 02:16) [12]

> Но и твой пример не впечатляет, увы

Меня впечатлил, и даже очень. После того, как полдня эту плюху вылавливал, да еще и без отладчика (были на то причины).

> KSergey ©   (01.05.09 15:42) [13]

Вот по этой причине она у меня всегда и включена.


KSergey   (2009-05-01 15:42:00) [31]

> Franzy   (30.04.09 16:12) [4]
> Как выяснилось, в одном месте я обращался к несуществующему  элементу дин. массива.

Ставим галку check range в свойствах проекта - и избавляемся от подобных ошибок однозначно. Пусть и некоторой потерей скорости.
Потом после тестов в релизном варианте галку снять и пересобрать.


Германн   (2009-05-01 02:16:00) [32]


> Юрий Зотов ©   (01.05.09 01:44) [9]
>
> Недавно наткнулся на такой пример "абсолютно необъяснимого
> глюка".
>

Это уже "перебор" :)
Ты уж, Юра, извини! Мы говорим о вопросе "этого автора"?
Но и твой пример в Юрий Зотов ©   (01.05.09 01:44) [9]- не впечатляет, увы.


AndreyV   (2009-05-01 02:15:00) [33]

> [9] Юрий Зотов ©   (01.05.09 01:44)
> O1 := O2;
> // Объект O2 был предварительно заполнен правильными данными, поэтому
> // теперь объект О1 тоже содержит правильные данные.

Получается, что неправильные.


Кролик-Фролик   (2009-05-01 01:57:00) [34]

так автор программирует по-современному - надергал кода из разных мест, слепил нечто
если появляются ошибки, то строки кода удаляются, пока ошибка не исчезнет
этот стиль щас самый модный


Юрий Зотов   (2009-05-01 01:44:00) [35]

Недавно наткнулся на такой пример "абсолютно необъяснимого глюка".

Есть объект O1. До какого-то места в программе он содержит правильные данные, а затем эти данные непостижимым образом портятся. И вот что в итоге выяснилось:

O1 := O2;
// Объект O2 был предварительно заполнен правильными данными, поэтому
// теперь объект О1 тоже содержит правильные данные.
// Далее идет много-много недетского кода, много разных вызовов.
// И, наконец:
O2.F1 := ...;
O2.F2 := ...;
// Вуаля! Объект O1 неявно испорчен!

Абсолютно непостижимый глюк. Но не программы, а программиста.


Германн   (2009-05-01 00:11:00) [36]

С автором такое уже не впервые :)
http://delphimaster.ru/cgi-bin/forum.pl?id=1240482954&n=18


Юрий Зотов   (2009-05-01 00:04:00) [37]

> Franzy   (30.04.09 16:12) [4]

Случайное поведение программы, очевидно, может быть вызвано только ее обращением к случайным данным. Это обращение и надо искать.

Какой же это "абсолютно необъяснимый  глюк"? Вполне объяснимый, притом еще и однозначно.


@!!ex   (2009-04-30 18:58:00) [38]

> [4] Franzy   (30.04.09 16:12)
> Любопытно, однако, что первые два раза это число было правильным
> (нулем), а последующие разы - другим числом :) Магия.

Не знаю как работает - значит магия. :)
И не такую магию видели....
С указателями надо быть ОЧЕНЬ аккуратным. Таких ошибок можно наполучать - век не разгребешь.


Leonid Troyanovsky   (2009-04-30 17:09:00) [39]


> Franzy   (30.04.09 16:12) [4]

> :) Магия.

Свезло.
Могло б, скажем, на 2009 разу.

--
Regards, LVT.


Franzy   (2009-04-30 16:12:00) [40]

2Плохиш

Нет, не угадали. В строке номер 136701! :)
Как выяснилось, в одном месте я обращался к несуществующему элементу дин. массива. Соотв.-но, мне возвращалось случайное число. Любопытно, однако, что первые два раза это число было правильным (нулем), а последующие разы - другим числом :) Магия.

Как исправил, каждый раз теперь что нужно возвращает...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо