在 Dosbox 中安装鼠标导致段错误

Posted

技术标签:

【中文标题】在 Dosbox 中安装鼠标导致段错误【英文标题】:Installing mouse causes segment fault in Dosbox 【发布时间】:2021-09-02 23:58:44 【问题描述】:

我正在使用 Allegro4 制作一个支持 DOS 上的 GUI 的简单程序。 为了实现鼠标操作,我创建了一个显示鼠标当前信息的形状对象。 Allegro 提供了很多有用的全局变量,如mouse_x、mouse_y、mouse_b 等,只有通过以下代码安装鼠标驱动后才能使用。

install_mouse();

这是我的 MousePointerObjectClass。

class MousePointerObject : public GameObject 
public:
    MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent = nullptr, std::string res = "");
    virtual void preupdate();
    virtual void collides(GameObject &other);
    void notCollides(GameObject &other);

private:
    int pressed_;
    int released_;

    friend class Scene;
;
MousePointerObject::MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent, std::string res)
    : GameObject (scene, parent)

    setRenderer(new MousePointerRenderer(res + "/renderer"));
    setCollider(new PointCollider(0, 0));


void MousePointerObject::preupdate()

    place(Vector<float>(mouse_x, mouse_y));

    static int held_buttons = 0;
    int changed = mouse_b ^ held_buttons;
    pressed_ = changed & mouse_b;
    released_ = changed & ~mouse_b;
    held_buttons = mouse_b;


void MousePointerObject::collides(GameObject &other)

    if (pressed_ > 0)
        other.mouseDown(pressed_);
    if (released_ > 0)
        other.mouseUp(released_, true);
    other.mouse_inside_ = true;


void MousePointerObject::notCollides(GameObject &other)

    other.mouse_inside_ = false;
    if (released_ > 0)
        other.mouseUp(released_, false);

我在 Ubuntu 上使用 DJGPP 交叉编译了这个程序,它在 Ubuntu 和 Real Dos 上运行良好,没有任何冲突。 但是当它要在 Dosbox 或 Dosbox-x 上运行时,它会导致段错误。 无论鼠标指针是否显示在屏幕上,一旦调用 install_mouse(),当我移动鼠标指针时,Dosbox 会意外退出。 我费了很大劲才解决这个问题,但它们根本不起作用。

任何建议将不胜感激。

【问题讨论】:

不相关:很多有用的全局变量我们对有用的定义可能不同。 使用地址清理器为 ubuntu 编译并查看它是否报告错误。如果是这样,请修复它们。如果没有,您可能必须弄清楚如何让调试器在 dosbox 中工作。 【参考方案1】:

原因是由于我用于此程序的引擎。它曾经使用大量的 CPU 和 RAM。经过优化,CPU 和 RAM 使用率大幅下降,在 Dosbox 中也运行良好。 但是还是很慢,所以我一直在优化引擎。

【讨论】:

以上是关于在 Dosbox 中安装鼠标导致段错误的主要内容,如果未能解决你的问题,请参考以下文章

在DosBox SVN Daum中安装了WIn98,怎样实现访问本地硬盘

如何在 Python 2.7 中安装 Torch

odoo中安装了错误的模块,导致网页报错进不去,怎么修改后的上传

如何在 requirements.txt 中安装 git 源?

为啥无限递归会导致段错误

为啥这个非常简单的构造函数会导致段错误?