2015-08-08 4 views
0

В настоящее время я использую TGUI (графическую библиотеку на основе SFML) вместе с ECL (поэтому я могу использовать Lisp для конфигурации и скриптов). Он отлично работает на Linux/GCC, но на Windows/MinGW ЭСЛ выдает ошибку:Странное взаимодействие: ECL вызывает ошибки в окнах, когда TGUI пытается создать окно редактирования.

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 - это полностью несвязанные библиотеки, не разделяющие функции или зависящие друг от друга каким-либо образом, о которых я знаю. Кто-нибудь имеет представление о том, что может вызвать такое поведение?

EDIT: Просто сделал полную перекомпиляцию SFML, TGUI и ECL с самой последней версией MinGW, и она по-прежнему разрывается точно так же. Поэтому я решил, что этого достаточно, и я переписал свой проект, чтобы использовать SFGUI. Отныне этот вопрос имеет только академический интерес.

ответ

0

я, наконец, узнал, что могло бы произойти там:

В то время как ECL работает, он пытается обработать все пойманные исключения, ошибки сегментации, и т.д., которые происходят на это смотреть, даже если они никогда не взаимодействуют с LISP. И способ, которым они обрабатываются, - это сразу же перейти к REPL, когда они происходят, чтобы позволить ручную отладку.

Какая разумная вещь для всего, что происходит из-за ошибок в программе LISP или C/C++, которые взаимодействуют с ней, но слегка запутываются, когда ошибка возникает в несвязанном C++-коде (например, предполагаемая ошибка в TGUI).

Минимальный способ воспроизведения: Load 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; }