странное исключение с плавающей точкой - PullRequest
2 голосов
/ 20 мая 2011

У меня исключение с плавающей запятой в огромном приложении после некоторых изменений. Я попытался прокомментировать свои изменения и обнаружил, что FPE происходит, когда я включаю один простой вызов функции.

api::getMaxSize();

, который просто возвращает значение. выглядит так

int api::getMaxSize() { return 536870912; };

Это статическая функция-член. Когда я перемещаю это в заголовочный файл все работает нормально Я запутался, в чем может быть резон? Похоже, API находится в другом модуле и связан как динамическая библиотека, но как это может вызвать проблемы?

1010 * добавлены *

Существует функция maxBox (), которая является шаблоном и реализована в заголовочном файле api.h. Эта функция вызывает getMaxSize()

template <typename T>
static rectangle<T> maxBox()
{
    return rectangle<T>(
        getMinSize(), getMinSize(),
        getMaxSize(), getMaxSize()
    );
}

вот код вызова

if (!api::maxBox<double>().contains(box * scale)) { /* api::getMaxSize(); */ }

Если я включаю вызов getMaxSize (), программа начинает выдавать FPE, но getMaxSize () фактически никогда не вызывается.

добавлен Нашел FPE в box * scale, не могу понять, почему он работал без вызова getMaxSize(), но проблема решена. Спасибо всем.

Заранее спасибо.

1 Ответ

1 голос
/ 20 мая 2011

Исключения с плавающей точкой (фактически сигналы ) вызываются по разным причинам. Основные из них:

  • вы делите целое число на ноль
  • операция над переполнением целых чисел со знаком (целые числа без знака должны молча оборачиваться в C и C ++).

Как видите, они не имеют ничего общего с числами с плавающей запятой! Имя является историческим и не может быть изменено без разбивки большого количества исходного кода (в <signal.h> есть константа SIGFPE).

Возможно, здесь GetMaxSize возвращает значение, которое не может быть представлено int.

...