奇怪的交互:当 TGUI 尝试创建编辑框时,ECL 在 windows 上抛出错误
Weird interaction: ECL throws errors on windows when TGUI tries to create an Edit Box
我目前正在使用 TGUI(基于 SFML 的 GUI 库)和 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 是完全不相关的库,不共享功能或以我所知道的任何方式相互依赖。有谁知道可能导致此行为的原因吗?
编辑: 刚刚用最新版本的 MinGW 完全重新编译了 SFML、TGUI 和 ECL,它仍然以完全相同的方式中断。所以我决定够了,我将重写我的项目以改用 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; }
我目前正在使用 TGUI(基于 SFML 的 GUI 库)和 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 是完全不相关的库,不共享功能或以我所知道的任何方式相互依赖。有谁知道可能导致此行为的原因吗?
编辑: 刚刚用最新版本的 MinGW 完全重新编译了 SFML、TGUI 和 ECL,它仍然以完全相同的方式中断。所以我决定够了,我将重写我的项目以改用 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; }