_matherr не вызывается при сборке релиза (C ++ Builder 2007) - PullRequest
2 голосов
/ 13 января 2012

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

Есть что-то странное: в сборке Debug _matherr вызывается так, как предполагается, но не в Release. Я использую CodeGear C ++ Builder 2007. Под MSVC 2010 обработчик работает нормально, но мне нужны функции VCL для всего приложения. Поиск в Google ничего не дает, кроме сообщений о том, что _matherr не работает в DLL (что известно из документации).

И мой вопрос: что может быть причиной того, что _matherr не работает в Release?

// One of the methods with overflows.
double DoubleExponential::F(double x) const
{
    try
    {
        double y=pow(fabs(x),a);
        return 0.5 + sign(x)*G(y,1/a)/(2*G(1/a));
    }
    catch(PowExpOverflow)
    {
        return 0.5;
    }
}

// Exception.
struct PowExpOverflow {};

int _matherr (struct _exception *a){
    Application->MessageBox("Inside custom _matherr", "", MB_OK);
    if (a->type == OVERFLOW)
        if (!strcmp(a->name,"pow") ||
            !strcmp(a->name,"powl") ||
            !strcmp(a->name,"exp") ||
            !strcmp(a->name,"expl"))
        {
            throw PowExpOverflow();
        }
    return 0;
}

1 Ответ

1 голос
/ 19 февраля 2012

Проблема связана с ошибкой в ​​динамическом RTL, который я использую в сборке релиза ( описание ).Ошибка не была исправлена ​​в версии IDE, которую я использую, поэтому единственное работающее решение - перейти на более новую версию.Тем не менее, ясное объяснение очень помогает.

...