БлогNot. Почему С++ Builder не перехватывает математические ошибки...

Почему С++ Builder не перехватывает математические ошибки...

В классическом C++ есть математическая библиотека, прототипы функций которой описаны в заголовочном файле math.h:

#include <math.h>
//...
z=pow(x,y);

Увы, в C++ Builder этот код сгенерирует ошибку, например, при x=y=0, и обработка исключений стандартным блоком try/catch не поможет.

Дело в том, что блок try/catch работает только тогда, когда функции, которые надо обработать, генерируют исключения на уровне Windows. Стандартные функции из math.h исключений не создают. Они изменяют значение переменной errno и возвращают какой-то результат. Возможное решение проблемы - писать отдельный обработчик исключений средствами библиотеки math.h, это, в общем-то, возможно (п. 8.4), только куда он будет выводить результаты - в консоль, которой в приложении нету?

А вот, скажем, заменив вызов функции pow(x,y) на Power(x,y) или log(x) на LogN(число_E,x), получим то, что нужно:

try {
 z=Power(x,y);
}
catch (...) {
 ShowMessage ("Не удалось возвести в степень!");
 return;
}

Для работы "альтернативных" математических функций к модулю нужно подключить заголовочный файл

#include <Math.hpp>

К сожалению, в Math.hpp есть не всё - скажем, получить константу e для вычисления натурального логарфима мне удалось только через math.h:

#include <Math.hpp>
#include <math.h>
//...
z=LogN(M_E,x);

Ещё учтите, что при включённой в Builder отладке и запуске приложения из-под Билдера, среда всё равно перехватит ошибку раньше приложения. Чтобы увидеть в действии контроль ошибок, запустите исполняемый файл приложения не из среды, а из папки с EXE-файлом. Как сделать "полноценный" EXE-файл, который будет запускаться на машинах без установленного C++ Builder - тут.

29.04.2013, 13:52 [13324 просмотра]


теги: c++ программирование ошибка математика builder

К этой статье пока нет комментариев, Ваш будет первым