Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

Try..Except...   Найти похожие ветки 

 
wdr ©   (2002-07-23 08:23) [0]

Почему-то на двух компутерах (из 20) не поддерживается обработка исключительной ситуации при попытке деления на 0.
Подскажите, кто знает, в чем может быть причина. На одном из этих компов установлен проц Сел-333 и Win-98, на другом
Duron-850 и Win-98. Вот пример проги:

procedure TForm1.Button2Click(Sender: TObject);
var
X, Y, Z: real;
begin
X:=StrToFloat(Edit1.Text);
Y:=StrToFloat(Edit2.Text);
try
Z:=X / Y;
Edit3.Text:=Format("%15.2f", [Z]);
except
ShowMessage("!!! ERROR !!!");
Edit3.Text:="ERROR";
end;
end;

Проще некуда, но если делить на 0, то сразу "синий экран смерти",
хорошо, хоть перезагрузки не требуется.

Спасибо, Alex.


 
kerberos   (2002-07-23 09:22) [1]

Посмотри какой на этих машинах установлен системный разделитель


 
Lord Warlock ©   (2002-07-23 09:36) [2]

вообще-то неплохо StrToFloat поместить в try


 
doomin   (2002-07-23 09:49) [3]

Такие серьезные аппаратные исключения лучше не обрабатывать а не допускать. Ресурсов это займет меньше... Можно просто проверить Y на предмет нуля. А StrToFloat настоятельно рекомендуется поместить в try..except


 
VICTOR_   (2002-07-23 11:31) [4]

>wdr © (23.07.02 08:23)
>Почему-то на двух компутерах (из 20) не поддерживается >обработка исключительной ситуации при попытке деления на 0.
Вероятно, у тебя материнка с VIA логикой. Сам сталкивался с такой проблемой.
Варианты решения
1.Поменяй материнку на Intel логику
2.Поставь WIN2000,NT,XP
3.Делай проверку типа
If Y <> 0 then


 
AlSok   (2002-07-23 12:32) [5]

VIA zdes" ne prichem.
J proverjl raboty na samih raznih konfigyracijh, nachinaj s 600MGz pojvljetsj takaj oshibka.
Eto voznikaet ne tol"ko v slychae s deleniem na 0, no i pri perepolnenii float tipa, ymnojenie, fynkcij "power", ...;
Takje pri izvlechenii kornj iz NAN, v fynkcii "tan", "arctan" pri zadanii nedopystimih znachenii.
V svoe vremj ob etom pisali Borlandy, no on otmalchivalsj, a obnaryjili eto esche v Delphi4.
-----
Samii pravil"nii pyt" eto vsegda proverjt" na dopystimost" operacii i ne ispol"zovat" try-except.


 
IlyaA   (2002-07-24 09:52) [6]

Замечание:
Я провёл несколько эксперементов и замитил что если писать a:=b/0, то Exception Raised, а если писать a:=1/0, то нет.


 
Вячеслав ©   (2002-07-24 13:52) [7]

Никогда не делай >> проверку типа
If Y <> 0 then...
Никакого разумного результата не будет. Знаменатель надо сранивать не с нулем, а с малым числом, близким к нулю с нужной точностью. И не на равенство, а на больше/меньше.
И StrToFloat действительно нужно загнать в обработчик исключений.


 
Anatoly Podgoretsky ©   (2002-07-24 14:01) [8]

IlyaA (24.07.02 09:52)
Ты думаешь это выполняется a:=1/0? Компилятор не настолько дурной.


 
Ростопопулас   (2002-07-24 14:03) [9]

А железо одинаковое на этих компах или нет?


 
IlyaA   (2002-07-24 14:14) [10]

> Anatoly Podgoretsky - А ты попробуй.
Я пробовал перед тем как написал. В данном случае он выдёт INF при сл. выводе ShowMessage(FloatToStr(a));


 
МИФИст ©   (2002-07-24 15:57) [11]

procedure TForm1.Button2Click(Sender: TObject);
var
X, Y, Z: extended;
begin
X:=StrToFloat(Edit1.Text);
Y:=StrToFloat(Edit2.Text);
if Y=0 then
begin
ShowMessage("!!! ERROR !!!");
Edit3.Text:="ERROR";
Exit;
end;
Z:=X / Y;
Edit3.Text:=Format("%15.2f", [Z]);
end;


 
AlexanderVasjuk ©   (2002-07-25 11:26) [12]

Подобная проблема знакома. Причем в целочисленной арифметике. На Intel все нормально, на AMD - фатальный глюк глюк. Пришлось ставить проверку на нуль, всё ОК.


VICTOR_ (23.07.02 11:31)
Менять материнки у всех юзеров накладно однако.


 
wdr ©   (2002-07-25 11:38) [13]

Проверку типа <<If Y <> 0 then...>> делать не собираюсь, т.к.
try ... except специально для этого и придумали. По поводу железа могу сказать следуещее: два абсолютно одинаковых компа, на одном Win-98, на другом XP. Проц:- Duron-850. Где 98 - смерть,
на ХР все O"k.


 
AlexanderVasjuk ©   (2002-07-25 12:37) [14]

wdr © (25.07.02 11:38)

Ну, если "смерть" тебя устраивает...


 
VICTOR_   (2002-07-25 15:18) [15]

>AlexanderVasjuk © (25.07.02 11:26)
>Подобная проблема знакома. Причем в целочисленной арифметике. >На Intel все нормально, на AMD - фатальный глюк глюк. Пришлось >ставить проверку на нуль, всё ОК.
Проблему решал аналогично
По опыту работы - проблема не в процессоре AMD + WIN98, а в материнке VIA + WIN98(напр. VIA KT133/A). К сожалению не могу сказать на всех ли новых VIA-материнках проявляется эта ошибка

>Менять материнки у всех юзеров накладно однако.
Согласен, но никто не гарантирует, что подобная ошибка не вылезет в другой аналогичной, но чужой, программе.

>AlSok (23.07.02 12:32)
Ты точно проверял на материнках с Intel-логикой или только были разные процессоры?


 
987   (2002-07-26 00:04) [16]

О, у меня похожая проблема. Можете глянуть
<Просто кошмар!!! Ln(X), где X 0 вешает Win98>


 
987   (2002-07-26 00:13) [17]

Да, тут некоторые высказывали мнения, что нужно самому что-то там проверять. Так делать нельзя. Во-первых, всех случаев можно у не учесть. А Во-вторых, что самое главное, это-же очень медленно!!! Хорошо, если нужно проверить при вводе юзера. А если надо 1000 раз в секунду? Именно, что только try..except. Только как?

А это только на Дельфи? Если на каком нибудь VC++?


 
wdr ©   (2002-07-26 07:17) [18]

Благодарю всех за столь бурное обсуждение этой проблемы.
Вчера установил ХР на Duron и ни-каких проблем с делением на 0
не было. Советую всем, у кого аналогичная проблема, установить
XP (если позволяею ресурсы железа). Проблема не только в материнке с VIA. У меня на двух компах VIA-Appolo и Win-98,
все работает как надо. Это наверное "черная дыра", как в Бермудском треугольнике.



Страницы: 1 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
1-8034
FleX
2002-09-22 15:14
2002.10.03
Как поместить иконки в Popup Menu


3-7796
deva
2002-09-11 19:02
2002.10.03
QuickReport и русские названия полей в табл. Paradox


3-7787
robi
2002-09-16 09:43
2002.10.03
компоненты доступа к dbf без BDE


3-7809
MikeFW
2002-09-10 17:46
2002.10.03
Как отформатировать колонку в BDGrid?


3-7880
RDA
2002-09-13 22:29
2002.10.03
Возврат к старому значению поля