Я пытаюсь преобразовать double в float, а также различные целочисленные типы внутри dll, который используется в качестве расширения Game Maker. Мне не нужен разумный результат, если double не соответствует диапазону целевых типов, поэтому я просто использовал static_cast.Как предотвратить/пресекать SIGFPE на C++?
Все работает по назначению, когда я вызываю этот код из своего собственного тестового приложения на C++, но когда он вызывается из Game Maker, ошибки диапазона поднимают SIGFPE по какой-то причине, что приводит Game Maker к завершению моей программы с сообщением об ошибке.
Мне не нужны разумные результаты для конверсий вне диапазона, но сбой - это не-нет. Я попробовал использовать llround вместо cast, но также поднимает сигнал.
Я также попытался поймать сигнал сам, используя сигнал (SIGFPE, SIG_IGN); прямо перед конверсией, но он вообще не менял поведения. Может быть, зловещий комментарий в mingw signal.h имеет какое-то отношение к этому: «SIGFPE, похоже, не работает?»
Я проверил исходный код другой dll, используемой в расширении Game Maker, и предоставленный автором двоичный файл выполняет простые преобразования конверсий без проблем. Однако, когда я компилирую исходный код, проблема SIGFPE присутствует снова. Я предполагаю, что автор использовал другой компилятор, но я предпочел бы остаться с mingw, если это возможно.
Итак, как я могу выполнить эти преобразования безопасно или предотвратить генерирование сигнала, когда я выполняю их с помощью простого трансляции? Я использую mingw-g ++ 4.5.0 для компиляции на данный момент.
Вот функция, где проблема происходит:
template<typename ValueType>
static double writeIntValue(double handle, double value) {
boost::shared_ptr<Writable> writable = handles.find<Writable>(handle);
if(writable) {
// Execution reaches this point
ValueType converted = static_cast<ValueType>(value);
// Execution doesn't reach this point if e.g. ValueType
// is short and value is 40000
writable->write(reinterpret_cast<uint8_t *>(&converted), sizeof(converted));
}
return 0;
}
Вы уверены, что это переходы вне диапазона, которые вызывают SIGFPE, а не деление на 0? –
Да. Я добавил код функции, в которой возникает проблема, и нет ни деления, ни 0. – Medo42