В настоящее время я использую TGUI (библиотека GUI на основе SFML) вместе с ECL (поэтому я могу использовать Lisp для конфигурации и скриптов). На Linux / gcc работает нормально, но на Windows / MinGW ECL выдает ошибку:
Condition of type: FLOATING-POINT-INVALID-OPERATION
#<a FLOATING-POINT-INVALID-OPERATION>
Available restarts:
1. (CONTINUE) Ignore signal
Top level in: #<process TOP-LEVEL>.
>
Точка в коде, в которой выдается ошибка (минимальный код, который ее создает):
empty_panel = tgui::Panel::Ptr(*cur_gui, "empty_panel");
empty_panel->setSize(cfg.res.x, cfg.res.y);
empty_panel->setBackgroundColor(sf::Color::Transparent);
tgui::EditBox::Ptr txt_test(*empty_panel, "txt_test");
Обратите внимание, что я могу просто создавать метки, кнопки, флажки и т. Д., Но как только я пытаюсь создать поле редактирования, ECL жалуется.
Это не имеет никакого смысла для меня вообще. TGUI и ECL — совершенно не связанные библиотеки, не разделяющие функции или зависящие друг от друга каким-либо образом, о котором я знаю. У кого-нибудь есть идеи, что может вызвать такое поведение?
РЕДАКТИРОВАТЬ: Только что выполнил полную перекомпиляцию SFML, TGUI и ECL с самой последней версией MinGW, и она все равно ломается точно так же. Поэтому я решил, что этого достаточно, и я перепишу свой проект, чтобы использовать вместо него SFGUI.
Отныне этот вопрос представляет только академический интерес.
Я наконец узнал, что могло произойти там:
Во время работы ECL он пытается обработать все необработанные исключения, ошибки сегмента и т. Д., Которые происходят на его часах, даже если они никогда не взаимодействуют с LISP. И способ, которым он обрабатывает их, заключается в немедленном переходе к REPL, когда они происходят, чтобы разрешить ручную отладку.
Что является нормальным делом для всего, что происходит из-за ошибок в программе LISP или функциях C / C ++, которые взаимодействуют с ним, но слегка сбивает с толку, когда ошибка происходит в несвязанном коде C ++ (как предполагаемая ошибка в TGUI).
Минимальный способ воспроизведения: загрузите ECL и попробуйте несколько недопустимых операций, например:
#include <ecl/ecl.h>
int main(int argc, char **argv) {
cl_boot(argc, argv);
atexit(cl_shutdown);
int x = 1/0;
return EXIT_SUCCESS; }