1

我有一个定义如下的枚举,所以期望它返回 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]; }

......

至于行:

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。对我所缺少的任何想法将不胜感激,谢谢。

4

2 回答 2

1

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

于 2012-06-26T14:43:34.150 回答
0

我的心理调试能力告诉我,您gameGrid是根据向量的向量(或类似向量)实现的,并且其中一个向量的范围不够大(您是否忘记调用push_backresize?):您正在运行用您选择的x和关闭空间的尽头y。一旦您超出了您的空间范围,所有关于您读取的内存值的赌注都将被取消。

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

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

于 2012-06-26T14:47:09.547 回答