![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Абсолютно необъяснимый глюк
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! :)
Как выяснилось, в одном месте я обращался к несуществующему элементу дин. массива. Соотв.-но, мне возвращалось случайное число. Любопытно, однако, что первые два раза это число было правильным (нулем), а последующие разы - другим числом :) Магия.
Как исправил, каждый раз теперь что нужно возвращает...