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

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

Что за ошибка? [D6, Win95/98]


Володя ©   (2002-03-21 14:43:00) 

В общем доходит до смешного.
Пишу, н-р, такой оператор:
var
x, q:extended;
...
x:=q/500;
...
Если поставить breakpoint после этого оператора, то все нормально. Если до и пройти по F8(F7), возникает ошибка "Invalid floatung operation". Причем, ошибка может быть, а может и не быть. В общем замучился. Не могу нормально отладить программу.
Может кто встречался с этим? Компилятор Delphi 6, Win98SE.
Спасибо, Володя


Володя   (2002-03-21 17:31:00) [1]

Ладно, парни. В чем был баг так и не понял, но проблему решил следующим образом. Просто в папке проекта удалил все файлы кроме *.pas, *.dfm и, конечно, *.dpr. После запуска Delphi все вспомогательные файлы создались заново (конечно, все настройки проекта потерял). После повторной настройки (пути, иконки и тп.) проблема пропала. Надеюсь навсегда. Спасибо всем принявшим участие в обсуждении.


-=CrazyFish=-   (2002-03-21 17:24:00) [2]

Код в студию не получится, т.к. нет его у меня сейчас.
Может в сгенерированном asm"е и были глюки, но в паскале все было верно.


Alx2   (2002-03-21 17:14:00) [3]

>-=CrazyFish=- © (21.03.02 17:09)
Код в студию!
Хочется на сгенерированный asm поглядеть


-=CrazyFish=-   (2002-03-21 17:09:00) [4]

Народ, вы будете смеяться, но пару месяцев назад столкнулся со следующим глюком
в строке x:=(тут вычисления с плавающей запятой);
вылезала ошибка "Invalid Floating Operation" все переменные были инициализированны кроме x. Когда я уже был в ступоре помогло только x:=0; а уже потом вышеуказанная строчка. Что вы скажете на это?


Alx2   (2002-03-21 17:01:00) [5]

>MBo © (21.03.02 16:57)
> x:=0;
Это, видимо, следствие неправильно понятого совета "прежде чем использовать переменные с плавающей запятой их желательно обнулять" (-=CrazyFish=- © (21.03.02 15:28))


McSimm   (2002-03-21 17:00:00) [6]

как описана процедура GetNorm( и где описаны NormK, NormS ?

> x:=0;
>x:=NormK*Q;

А перед x:=0 тоже желательно x проинициализировать :) (шутка)


MBo   (2002-03-21 16:57:00) [7]

x:=0;
x:=NormK*Q
x:=x/NormS
первые две строчки не генерируют кода - нет смысла (оптимизация)
NormS чему равно?


Alx2   (2002-03-21 16:52:00) [8]

Попробуй отключить оптимизацию, перекомпилируй и снова проверь где возникает exception.
Скорее всего из-за NormS


Володя   (2002-03-21 16:49:00) [9]

Даже не ожидал такого моментального отклика. Вообще собирался посмотреть завтра.Спасибо всем.
Вот ниже привожу кусок процедуры. У меня тоже были сомнения по поводу неопределенности значения. Но ошибка появляется и даже после такой инициализации.
var
Quant:Integer;
x, q:extended;
begin
ind:=0;
while GetNorm(Art, MontagName, NormK, NormS) do
begin
NormK:=0.4;
q:=4.67;
x:=0;
x:=NormK*Q;//Здесь ошибка invalid floating point operation, если здесь поставить breakpoint
x:=x/NormS;//или здесь,если breakpoint поставить здесь.Верхняя строчка отрабатывает без ошибки
end
end;
Это какая-то ерунда. Сам вижу. Все переменные определены. Мало того, инициализированы непосредственно перед использованием. (вариант случайных значений вроде как отпадает).
Причем откомпилированный exe-шник работает на ура. Проблема в том, что не могу отладить.


Alx2   (2002-03-21 16:11:00) [10]

Чем легче вопрос, тем сильнее понос....
Так мы скоро начнем разбирать с какой буквы слово "begin" правильно надо писать...

>Люди, инициализировать, конечно, надо. Только не x, а q.
Ну естественно...
Однако ни кода нет, нии автора...


McSimm   (2002-03-21 16:02:00) [11]

>MBo © (21.03.02 15:50)
Вот и я думаю... :)

Люди, инициализировать, конечно, надо. Только не x, а q.
Происходит ошибка потому, что в памяти, отведенной для q оказываются случайные значения. Если для Integer это в принципе не страшно, то для Extended... - не всякий набор бит можно разделить на 500 :))


MBo   (2002-03-21 15:50:00) [12]

а был ли мальчик? :)


-=CrazyFish=-   (2002-03-21 15:36:00) [13]

ну погорячился я насчет нуля... ;) согласен


Alx2   (2002-03-21 15:31:00) [14]

>-=CrazyFish=- © (21.03.02 15:28)
???

А если просто инициализировать? (Не обязательно нулем)


-=CrazyFish=-   (2002-03-21 15:28:00) [15]

прежде чем использовать переменные с плавающей запятой их желательно обнулять


-=CrazyFish=-   (2002-03-21 15:24:00) [16]

перед
x:=q/500;
присвой
x:=0;
должно сработать


Alx2   (2002-03-21 14:58:00) [17]

Да, скорее всего инициализация...


Andrey007   (2002-03-21 14:47:00) [18]

А Вы первоначальную инициализацию переменных сделали? Ещё нужно посмортеть значения этих переменных - может быть выход за границы диапазон. А вообще, похоже, что на ноль делите.


Alx2   (2002-03-21 14:45:00) [19]

Странно...
А код полностью можно?


Наверх

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