Шаг 388 - Еще про обработку деления на ноль

----- Original Message ----- 
From: Kaev 
To: a_mazurkov@hotbox.ru 
Sent: Wednesday, July 03, 2002 2:24 AM
Subject: Re

Привет, Артем.

Извини, что не ответил в тот же день, возился с твоим примером и со своими обработчиками тоже. Для меня оказалось большим сюрпризом "наплевательское" отношение VC++ 6.0 к математическим ошибкам. До сих пор, по ряду причин, я работал с шестнадцатиразрядным VC++ 1.52, а там "General Protection Fault" выскакивало "железно". В прикладных программах, помимо деления на ноль, возникают и другие математические ошибки. Здесь я использую старый добрый signal, который, как оказалось, также не функционирует в Release конфигурации проекта VC++ 6.0, в отличие от VC++ 1.52. В комментарии к примеру из MSDN для _clear87() прямо указано: "Compile this program with Optimizations disabled (/Od). Otherwise the optimizer will remove the code associated with the unused floating-point values.". Под Realese-ом твой пример будет выглядеть так:

// Step351
// Сайт Первые шаги (www.firststeps.ru)
// Каев Артем (1999-2001)
//
// создано 26.06.2001
//
 
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
#include "float.h" // объявление функций для данных с плавающей точкой
 
#pragma optimize( "", off ) //Можно отключить оптимизацию и в проекте

void main()
{
//---------- Настройка исключительных ситуаций
int status;
status=_controlfp(0,0); 		// получаем текущее состояние
status &= ~EM_ZERODIVIDE; 		// будет генерироваться исключение при делении на 0
_controlfp(status,MCW_EM); 		// установить
//---------- Конец настройки исключительных ситуаций
double i=-9;
try
{
i=i/0;
}
catch(...)
{
cout << "error" << endl;
}
}
#pragma optimize( "", on )

Работает, как часы. С уважением, Анатолий Мазурков.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 05.07.2002