Точность FP связана с "Отладка не подтверждена!" (Понятия не имею, почему это происходит) - PullRequest
0 голосов
/ 07 января 2019

Хорошо, поэтому я решил создать приложение WinAPI, которое рисует модульное умножение на круге, и, если множитель находится в диапазоне от 0 до 0,1 (границы не включены), происходит сбой. При отладке всплывает окно с сообщением об ошибке «Отладочное утверждение не удалось!» и «Нажмите« Повторить »для отладки приложения».

(Так как у меня 1 точка повторения, я не могу публиковать изображения, но это окно сообщения об ошибке )

Когда я нажимаю «Повторить», он всегда прерывает выполнение в операторе if else, не показывая никакой полезной информации. То, что оценивается в if else, не имеет значения, но предполагается преобразовать число типа FLOAT в CHAR *, а затем преобразовать CHAR * в WCHAR *. Это часть кода, которая (по-видимому) не работает:

if (useFloat == FALSE)
    _gcvt_s(buff, 7, (multiplier / 100.0f), 4); // multiplier is type size_t (ull)
else                                            // This is where the breakpoint is set.
    _gcvt_s(buff, 7, fMultiplier, 4);           // fMultiplier is type FLOAT

mbstowcs_s(NULL, text, 7, buff, 7);

На этом этапе выполнение прерывается, но, поскольку это может быть что-то с самим рисунком, я включаю цикл, который рисует модульное умножение на круге (хотя мне это кажется подходящим):

if (useFloat == FALSE)
    for (size_t i = 0; i < 360; i++)
    {
        pRenderTarget->DrawLine(
            D2D1::Point2F(
                ellipse.radiusX * cosf(i * (float)M_PI / 180.0f) + ellipse.point.x,
                ellipse.radiusY * -sinf(i * (float)M_PI / 180.0f) + ellipse.point.y),
            D2D1::Point2F(
                ellipse.radiusX * cosf(i * (float)M_PI / 180.0f * (multiplier / 100.0f)) + ellipse.point.x,
                ellipse.radiusY * -sinf(i * (float)M_PI / 180.0f * (multiplier / 100.0f)) + ellipse.point.y),
            pBrushLine);
    }
else
    for (size_t i = 0; i < 360; i++)
    {
        pRenderTarget->DrawLine(
            D2D1::Point2F(
                ellipse.radiusX * cosf(i * (float)M_PI / 180.0f) + ellipse.point.x,
                ellipse.radiusY * -sinf(i * (float)M_PI / 180.0f) + ellipse.point.y),
            D2D1::Point2F(
                ellipse.radiusX * cosf(i * (float)M_PI / 180.0f * fMultiplier) + ellipse.point.x,
                ellipse.radiusY * -sinf(i * (float)M_PI / 180.0f * fMultiplier) + ellipse.point.y),
            pBrushLine);
    }

Так что да, я абсолютно не знаю, почему это происходит, я прочитал тонны потоков в MSDN, SO и Reddit, и у меня до сих пор нет ни единой подсказки, почему это может происходить.

...