0

私はCellsを含むプログラムを作成しています。そのために、CellクラスとCellManagerクラスがあります。セルは2次元配列で編成され、Cellクラスマネージャーには、配列のサイズを反映するxgridとygridの2つのintメンバー変数があります。

どういうわけか、私には理解できません。これらのメンバー変数は、プログラムの実行中に変化します。なぜこれが起こっているのか誰かが理解できますか、あるいは私をどこを見るべき方向に向けるかもしれません。

使用されるクラスと関数は次のようになります。

class Cell
{
    public:
        Cell(int x, int y);
}

---------------------------------

class CellManager
{
     public:
         CellManager(int xg, int yg)

         void registercell(Cell* cell, int x, int y);
         int getxgrid() {return xgrid;}
         int getygrid() {return ygrid;}

     private:
         int xgrid;
         int ygrid;         
         Cell *cells[40][25];

}

-----------------------

and CellManagers functions:

CellManager::CellManager(int xg, int yg)
{
    CellManager::xgrid = xg;
    CellManager::ygrid = yg;
}

void CellManager::registercell(Cell *cell, int x, int y)
{
    cells[x][y] = cell;
}

そしてここに主な機能があります:

int main ()
{
    const int XGRID = 40;
    const int YGRID = 25;

    CellManager *CellsMgr = new CellManager(XGRID, YGRID);

    std::cout << CellsMgr->getxgrid() << std::endl; // PRINTS 40 
    std::cout << CellsMgr->getygrid() << std::endl; // PRINTS 25

    //create the cells and register them with CellManager
    for(int i = 1; i <= XGRID; i++) {

        for(int j = 1; j <= YGRID; j++) {

            Cell* cell = new Cell(i, j);
            CellsMgr->registercell(cell, i, j);
        }
    }

    std::cout << CellsMgr->getxgrid() << std::endl; // PRINTS A RANDOM LARGE INT, EX. 7763680 !!
    std::cout << CellsMgr->getygrid() << std::endl; // PRINTS 1, ALWAYS !!

そこで、CellMgrを初期化し、コンストラクターを介してxgridとygridを設定します。次に、セルの束を作成し、CellMgrに登録します。この後、CellMgrの2つのメンバー変数が変更されましたが、これがどのように発生するかを知っている人はいますか?

4

1 に答える 1

12

配列はゼロインデックスですが、1からインデックスが付けられているかのように使用しています。その結果、配列のインデックスはセルを上書きし、配列の終わりを書き留めます。これは未定義の動作です。ランダムな他の変数を上書きすることは確かに可能です。

于 2012-12-30T17:47:12.103 に答える