我有一个枚举定义如下,所以期望它返回0-6之间的值
enum blocks
{ none = 0, red, green, blue, yellow, white, black };
Grid<blocks> gameGrid; // initialised to none
我试图将枚举用作包含块颜色的数组的偏移量。但是gameGrid[y][x]
返回的数字超出了上述范围,从而导致分段错误。
fixedColor = colourArray[gameGrid[y][x]];
我检查过y和x在范围(0-19)范围内,gdb报告:
(gdb) print y $1 = 19 (gdb) print x $2 = 5 (gdb) print gameGrid[y][x] $3 = (blocks &) @0x8201dc4: 136172580
以下是网格的定义:
template <typename T>
class Grid
{
std::deque<Row<T> > rows;
T defaultValue;
public:
const unsigned width, height;
Grid(unsigned inWidth, unsigned inHeight, T inValue) : defaultValue(inValue), width(inWidth), height(inHeight)
{
Row<T> r(width, inValue);
for (unsigned i = height; i; --i)
rows.push_back(r);
}
Row<T>& operator[](unsigned arg) { return rows[arg]; }
.....
至于Row:
template <typename T>
class Row
{
public:
std::vector<T> elements;
Row(unsigned inWidth, T inValue) : elements(inWidth, inValue) {};
T& operator[](unsigned arg) { return elements[arg]; }
...
我打电话给:
Game::Game(App& inApp) : theApp(inApp), bgColour(sf::Color::Black), gridWidth(10), gridHeight(20), gameGrid(gridWidth, gridHeight, blocks::none),
.....
我很好奇块类型的gameGrid值如何评估为136172580。 非常感谢您对我所缺少的任何想法,谢谢。
答案 0 :(得分:1)
这感觉很像一个未初始化的变量问题 - 在所有情况下你都没有在网格中初始化你的枚举。当你使用gdb时,你可能在Linux平台上。你试过通过valgrind运行你的exe吗?它会告诉你这些事情......
答案 1 :(得分:0)
我的通灵调试能力告诉我你的gameGrid
是根据向量(或类似)向量实现的,并且其中一个向量的范围不够大(你是否忘了打电话) push_back
或resize
?):您使用所选的x
和y
离开了空格的末尾。一旦你超出了你的空间范围,所有的赌注都会关闭你所读取的记忆的价值。
从你的问题来看,听起来你最有可能来自C或C ++以外的语言。在C ++中,虽然它为您提供了帮助编写正确代码的重要工具,但仍有各种不正确的代码可以编译得很好。编译器假定您知道自己在做什么并分配了适当的内存量。如果编写错误的代码C ++允许您从几乎任意的内存中读取,那么您可能会为枚举类型获得看似无效/垃圾值的情况并不奇怪。
编辑:这里想到一个新想法。如果在sf::Style::Fullscreen Game::Game
类中,在宽度和高度成员之前声明了gameGrid
成员,则将首先使用垃圾值初始化它。您在构造函数中列出它们的顺序与它们实际初始化的顺序无关。 g ++甚至对此有警告。