----- 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 )
Работает, как часы. С уважением, Анатолий Мазурков.