Форум: "Система";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c