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がベクトルのベクトル(または同様のもの)の観点から実装されており、ベクトルの1つの範囲が十分に大きくないことを教えてくれます(またはを呼び出すのを忘れましたpush_backresize?):実行中です選択xした とでスペースの端をオフにしますy。スペースの範囲外になると、読み取ったメモリの値に関するすべての賭けが無効になります。

あなたの質問から、あなたはおそらく C または C++ 以外の言語から来ているように思えます。C++ では、正しいコードを作成するのに役立つ重要なツールが提供されますが、問題なくコンパイルできるさまざまな不適切なコードがあります。コンパイラは、ユーザーが何をしているかを認識しており、適切な量のメモリを割り当てていることを前提としています。間違ったコードを記述した場合、C++ ではほぼ任意のメモリから読み取ることができるため、列挙型に対して一見無効/ガベージ値を取得できてもまったく驚くことではありません。

編集:ここで頭に浮かぶ新しいアイデア。sf::Style::Fullscreen Game::Gameクラス内でgameGrid幅メンバーと高さメンバーの前にメンバーが宣言されている場合、最初にガベージ値で初期化されます。コンストラクターでリストする順序は、実際に初期化される順序とは無関係です。g++ には、これに対する警告さえあります。

于 2012-06-26T14:47:09.547 に答える