C++/SDL 如何覆盖数组?
C++/SDL Overwriting an array some how?
我正在为一个项目创建一个游戏引擎,并使用 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.x
和MousePosition.y
永远不会更改,这意味着它们0
。从现在到永恒,他们将0
.
如果编译器按照我期望的方式优化您的代码,它只会删除MousePosition
并完全MouseDeltaPosition
,并用文字0
替换MousePosition.x
、MousePosition.y
、MouseDeltaPosition.x
和MouseDeltaPosition.y
中的所有读取,这就是您在数组中编写的原因。
TLDR:不要对编译器撒谎。如果你正在写入一个变量,不要让它变得常量并抛弃恒常性。
编辑:
这是从简单的操作:Input.GetMouseButton(0( 当鼠标处于某个位置时返回 255
好吧,看看这个函数:
bool CInput::GetMouseButton(int button)
{
return _mouseButtons[button - 1];
}
0 - 1
-1
因此从_mouseButtons[-1]
读取数据会从其他地方读取数据。未定义的行为。
- C++找出覆盖同一行的数组
- C++/SDL 如何覆盖数组?
- 当将多个TypedArrayContents数组加载到V8数组中时(数组数组)时,最后一个元素将覆盖所有元素
- 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值
- 覆盖数组元素时如何调用构造函数
- c ++ 我的 char* 数组被最后一个添加的元素覆盖
- 初始值设定项列表覆盖动态多维数组的内存
- 编写一个函数,该函数将覆盖主函数数组中的值
- 将用户输入存储到2D数组中时要覆盖的值
- 从函数更新(覆盖)和显示数组
- 覆盖和扩展数组或矩阵,而不在特征中定义其大小
- 用静态数组覆盖指针属性
- 用较大的数组覆盖数组
- c++中的数组和覆盖-可以重用同一个对象吗?
- 我的数组值是如何被覆盖的
- 溢出字符数组每次都覆盖完全相同的字符串-为什么?
- 分配结构数组后覆盖的内存
- 为什么 std::getline 会覆盖包含文件名的字符数组
- 覆盖无符号字符数组中的值时出错
- 指针数组中的值被覆盖