C ++枚举计算为意外值

时间:2012-06-26 14:37:43

标签: c++ arrays enums

我有一个枚举定义如下,所以期望它返回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。 非常感谢您对我所缺少的任何想法,谢谢。

2 个答案:

答案 0 :(得分:1)

这感觉很像一个未初始化的变量问题 - 在所有情况下你都没有在网格中初始化你的枚举。当你使用gdb时,你可能在Linux平台上。你试过通过valgrind运行你的exe吗?它会告诉你这些事情......

答案 1 :(得分:0)

我的通灵调试能力告诉我你的gameGrid是根据向量(或类似)向量实现的,并且其中一个向量的范围不够大(你是否忘了打电话) push_backresize?):您使用所选的xy离开了空格的末尾。一旦你超出了你的空间范围,所有的赌注都会关闭你所读取的记忆的价值。

从你的问题来看,听起来你最有可能来自C或C ++以外的语言。在C ++中,虽然它为您提供了帮助编写正确代码的重要工具,但仍有各种不正确的代码可以编译得很好。编译器假定您知道自己在做什么并分配了适当的内存量。如果编写错误的代码C ++允许您从几乎任意的内存中读取,那么您可能会为枚举类型获得看似无效/垃圾值的情况并不奇怪。

编辑:这里想到一个新想法。如果在sf::Style::Fullscreen Game::Game类中,在宽度和高度成员之前声明了gameGrid成员,则将首先使用垃圾值初始化它。您在构造函数中列出它们的顺序与它们实际初始化的顺序无关。 g ++甚至对此有警告。