【发布时间】:2020-07-21 14:26:28
【问题描述】:
最近,我开始学习 SFML。我想做的第一件事是一个简单的菜单——所以我为所有菜单创建了一个界面,包含受保护字段中其他菜单所需的一切。但是,我的代码有时会引发异常,我不知道为什么。
#include <SFML/Graphics.hpp>
#include <iostream>
class Menu
{
protected:
sf::Color red;
sf::Color white;
std::vector<sf::Text> displayedText;
int currentOption{ 0 };
public:
virtual void draww(sf::RenderWindow& window) = 0;
virtual void clickButton() = 0;
virtual void moveUp() = 0;
virtual void moveDown() = 0;
};
class FirstMenu : public Menu
{
public:
FirstMenu(sf::RenderWindow& window)
{
sf::Text text;
sf::Font font;
if (!font.loadFromFile("arial.ttf"))
{
std::cout << "Font error. \n";
}
text.setFont(font);
text.setString("Play");
displayedText.push_back(text);
text.setString("Options");
displayedText.push_back(text);
displayedText[0].setFillColor(red);
displayedText[0].setPosition(20, 30);
displayedText[1].setPosition(30, 30);
}
virtual void clickButton()
{
switch (currentOption)
{
case 0:
std::cout << "Playing. \n";
break;
case 1:
std::cout << "Options. \n";
break;
}
}
virtual void moveUp()
{
currentOption++;
displayedText[currentOption].setFillColor(white);
for (int i = 0; i < displayedText.size(); i++)
{
if (i == currentOption)
{
displayedText[i].setFillColor(red);
}
}
}
virtual void moveDown()
{
currentOption--;
displayedText[currentOption].setFillColor(white);
for (int i = 0; i < displayedText.size(); i++)
{
if (i == currentOption)
{
displayedText[i].setFillColor(red);
}
}
}
virtual void draww(sf::RenderWindow& window)
{
if (!displayedText.empty())
{
for (int i = 0; i < displayedText.size(); i++)
{
window.draw(displayedText[i]); //Exception thrown here
}
}
}
};
int main()
{
sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!");
FirstMenu menu(window);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
menu.draww(window);
window.display();
}
return 0;
}
抛出异常时显示的文本是: “位置 0x799B35BB (sfml-graphics-2.dll) 中未处理的异常 0xC0000005: 读取位置 0x00000004" 时访问冲突
【问题讨论】:
-
该错误意味着您正在访问超出范围的数组。你能调试你的程序吗?我已经看到了一些我会仔细检查的事情:1)我会在
window.close()之后跳出 while 循环,2)我会在FirstMenu构造函数中使用两个sf::Text变量,以及 3)我将检查currentOption以不超出displayedText向量边界(即++ 不能上升size()-1和-- 不能下降0。 -
尝试
auto与向量后仍然抛出异常。调试时抛出异常。 -
您是如何构建可执行文件和链接 sfml DLL 的?
-
我在 Visual Studio 中使用“Debug x86”选项来调试我的代码。我将所有库链接到“Release”和“Debug”(在 Debug 中,我添加了“-d”后缀)。我完全不知道为什么我的程序会抛出这个异常
-
我的代码写得好吗?我不知道是我犯了错误还是将 SFML 链接到 Visual Studio 2019 时出现问题