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

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

Overflow... [D7, WinXP]


i ©   (2008-04-01 22:55:00) 

Как данный код может вызвать "Overflow while converting variant of type (LongWord) into type (Integer)." ?:


var
 _Now: TDateTime;
begin
 _Now := Now;
 with FmdAppV2 do
 begin
   Edit;                      

   Fields[iFinished2ActivePeriod].AsInteger :=
     Fields[iFinished2ActivePeriod].AsInteger + v2_ForegroundPeriod;

   Fields[iFinished2ActivityPeriod].AsInteger :=
     Fields[iFinished2ActivityPeriod].AsInteger + v2_ActivityPeriod;
   if Fields[iFinished2ActivityPeriod].AsInteger < 0 then
     Fields[iFinished2ActivityPeriod].AsInteger := 0;
   Post;
 end;


при том, что EurekaLog указывает на 1ю строку с _Now := Now.
(FmdAppV2 - это TMemoryData)


Loginov Dmitry   (2008-04-02 08:05:00) [1]

> Как данный код может вызвать "Overflow while converting
> variant of type (LongWord) into type (Integer)."


Для присвоения варианта переменной Integer генерируется вызов функции VarToInteger, которая проверяет, входит ли значение, находящееся в Variant в диапазон, допустимый для Integer. В результате функция BoundErr генерирует исключение.

Конкретно в данном коде причина такой ситуации непонятна. Она может возникнут, если v2_ForegroundPeriod (в версии, используемой пользователя) имеет тип Cardinal / Int64.

Разбирайся!


Германн   (2008-04-02 02:12:00) [2]

эьфа  читать как эльфа. :)


Германн   (2008-04-02 02:02:00) [3]


> i   (02.04.08 01:27) [15]
>
>

Ну если уж совсем упрёшься, вышли мне на мыло в анкете эьфа с этой ошибкой. Может помогу чем смогу.


Германн   (2008-04-02 01:55:00) [4]


> i   (02.04.08 01:27) [15]
>
>
> > У Эврики самая полезная вкладка "Call Stack". На неё в
> первую
> > очередь и заглядывай.
> >
>
>
> тока ей в основном и пользуюсь. я писал что она вообще показывает
> на строку
>  _Now := Now;
>

Кто "она"? Эврика?
Или вкладка "Call Stack"? Так сия вкладка, как правило, показывает много строк в коде. И это естественно для "нелинейного программирования".


Германн   (2008-04-02 01:45:00) [5]


> i   (02.04.08 01:26) [14]
>
> >А теперь включи опцию {$Q} и проверь ещё раз.
> вижу, эксепшен выглядит иначе - Integer overflow.
>
> "Overflow while converting variant of type (LongWord) into
> type (Integer)."  наводит на мысли об эксепшене при конвертации
> вариантных типов, тобеж косяк может крыться в AsInteger,
>  не?
>

Не знаю как в Д7, но поиск в Source BDS2006 файлов содержащих "Overflow while converting variant of type" привело меня к  SVarTypeConvertOverflow = 'Overflow while converting variant of type (%s) into type (%s)';
А поиск там же файлов содержащих "SVarTypeConvertOverflow" выдал 7 файлов. Разбирайся сам.


i   (2008-04-02 01:27:00) [6]


> У Эврики самая полезная вкладка "Call Stack". На неё в первую
> очередь и заглядывай.
>


тока ей в основном и пользуюсь. я писал что она вообще показывает на строку
 _Now := Now;

где тут быть эксепшену?


i   (2008-04-02 01:26:00) [7]

>А теперь включи опцию {$Q} и проверь ещё раз.
вижу, эксепшен выглядит иначе - Integer overflow.

"Overflow while converting variant of type (LongWord) into type (Integer)."  наводит на мысли об эксепшене при конвертации вариантных типов, тобеж косяк может крыться в AsInteger, не?


Германн   (2008-04-02 01:16:00) [8]


> при том, что EurekaLog указывает на 1ю строку с _Now :=
> Now.

У Эврики самая полезная вкладка "Call Stack". На неё в первую очередь и заглядывай.


Германн   (2008-04-02 01:02:00) [9]


> i   (02.04.08 00:29) [11]
>
>
> > Reindeer Moss Eater ©   (01.04.08 23:55) [8]
> >
> > а ты попробуй
> > var i : integer;
> >
> > i := maxint;
> > i := i + i;
>
>
> угу, integer переполняется без exception, просто ездит по
> кругу..
>

А теперь включи опцию {$Q} и проверь ещё раз.


i   (2008-04-02 00:29:00) [10]


> Reindeer Moss Eater ©   (01.04.08 23:55) [8]
>
> а ты попробуй
> var i : integer;
>
> i := maxint;
> i := i + i;


угу, integer переполняется без exception, просто ездит по кругу..


i   (2008-04-02 00:28:00) [11]


> вроде в TMemoryData все нумеруется с 1. Соотв. поправка
> сделана?

да


Vasya   (2008-04-02 00:14:00) [12]

вроде в TMemoryData все нумеруется с 1. Соотв. поправка сделана?


Reindeer Moss Eater   (2008-04-01 23:55:00) [13]

а ты попробуй
var i : integer;

i := maxint;
i := i + i;


i   (2008-04-01 23:54:00) [14]

:))

короче, такое может случаться если мы пытаемся в integer засунуть большое число? или есть другие варианты?


Reindeer Moss Eater   (2008-04-01 23:49:00) [15]

(FmdAppV2 - это TMemoryData)

остается только догадаться что же это такое


Reindeer Moss Eater   (2008-04-01 23:37:00) [16]

а ты передай это туда где это происходит


i   (2008-04-01 23:30:00) [17]


> F5 на первой строке потом F9 затем много раз F8


к сожалению, это не у меня происходит.


i   (2008-04-01 23:28:00) [18]

v2_ActivityPeriod: Integer;
   v2_ForegroundPeriod: Integer;

 iFinished2ActivePeriod   = 8;
 iFinished2ActivityPeriod = 9;

эти константы точно соответствуют полям таблицы (а тоб был index out of bonds..)

типа полей - ftInteger.

я так понимаю что ерека немного не туда показывает и косяк где-то в работе с таблицей? переполнении integer?


Anatoly Podgoretsky   (2008-04-01 23:02:00) [19]

> i  (01.04.2008 22:55:00)  [0]

Ты хочешь получить ответ и при не хочешб говорить о свои неизвестных переменных или константах.
Наивный.


Reindeer Moss Eater   (2008-04-01 23:01:00) [20]

F5 на первой строке потом F9 затем много раз F8


Наверх

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