C++/SDL 如何覆盖数组?

C++/SDL Overwriting an array some how?

本文关键字:覆盖 数组 SDL 何覆盖 C++      更新时间:2023-10-16

我正在为一个项目创建一个游戏引擎,并使用 SDL 进行输入和内容。

我有这样的东西:

class CInput
{
public:
CInput();
Rect MousePosition      = Rect(0, 0);
Rect MouseDeltaPosition = Rect(0, 0);
bool GetMouseButton(int button);
bool Process();
private:
bool _mouseButtons[5];
};
bool CInput::GetMouseButton(int button)
{
return _mouseButtons[button - 1];
}

矩形结构是这样的:

struct Rect
{
int x, y;
Rect(int x, int y) : x(x), y(y) {};
};

我正在记录鼠标按钮和动作,以便真正用于任何用途,但是当我设置鼠标位置/鼠标增量位置时,它似乎"溢出"到_mouseButtons数组上?

这是我的输入捕获:

while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_MOUSEMOTION:
MousePosition      = Rect(event.motion.x, event.motion.y);
MouseDeltaPosition = Rect(event.motion.xrel, event.motion.yrel);
break;
case SDL_MOUSEBUTTONDOWN:
_mouseButtons[event.button.button - 1] = true;
break;
case SDL_MOUSEBUTTONUP:
_mouseButtons[event.button.button - 1] = false;
break;
case SDL_QUIT:
return 0;
}
}

在测试期间,即使没有人按下按钮,_mouseButton数组也可以填满 255。

编辑---

伊姆古尔

这是从简单的做: 输入.获取鼠标按钮(0( 当鼠标处于某个位置时返回 255

!!我已经缩小了问题的范围,当 DeltaMousePosition.y 为负时,它似乎会发生,因为鼠标相对于窗口向上移动!可能是问题所在

const Rect MousePosition      = Rect(0, 0);
// ...
*(Rect*)(&MousePosition)      = Rect(event.motion.x, event.motion.y);

你告诉编译器 MousePosition 是 const。它不是引用也不是指针,因此编译器可以肯定地知道MousePosition.xMousePosition.y永远不会更改,这意味着它们0。从现在到永恒,他们将0.

如果编译器按照我期望的方式优化您的代码,它只会删除MousePosition并完全MouseDeltaPosition,并用文字0替换MousePosition.xMousePosition.yMouseDeltaPosition.xMouseDeltaPosition.y中的所有读取,这就是您在数组中编写的原因。

TLDR:不要对编译器撒谎。如果你正在写入一个变量,不要让它变得常量并抛弃恒常性。

编辑:

这是从简单的操作:Input.GetMouseButton(0( 当鼠标处于某个位置时返回 255

好吧,看看这个函数:

bool CInput::GetMouseButton(int button)
{
return _mouseButtons[button - 1];
}

0 - 1-1因此从_mouseButtons[-1]读取数据会从其他地方读取数据。未定义的行为。