1

自作のゲーム エンジンを使用してゲームを作成していますが、リストの使用に問題があります。

私のプログラムには、BoardState という構造があります。これらの各構造には、子と呼ばれる BoardState ポインターのリストがあります。これは、ゲームの AI 用に BoardStates のツリーを作成するためです。

ツリーの作成を支援するために、MakeBoard という関数があります。この関数は、新しいボードを作成するために必要なすべての情報を渡され、その新しいボードへのポインタを親ボードの子リストの最後に追加する必要があります。関連する関数 MakeBoard は次のとおりです。

void MakeBoard(BoardState* pStartBoard, int iPiece, int iPosStart, int iPosFinish, int* pJumpArray)

{

//BoardState* pNewBoard = &NewBoard;
//pNewBoard->bPlayerTurn = !(pStartBoard->bPlayerTurn);
//NewBoard.bPlayerTurn = !(pStartBoard->bPlayerTurn);
BoardState* pNewBoard = (BoardState*)malloc(sizeof(BoardState));

pNewBoard->bPlayerTurn = !(pStartBoard->bPlayerTurn);

// Copy the BoardPositions of the starting board into the new Board.
for(int i = 0; i < 37; i++)
{
    pNewBoard->posArray[i] = pStartBoard->posArray[i];
    //NewBoard.posArray[i] = pStartBoard->posArray[i];
}

// Make the BoardPosition change necessary to reflect the move.
pNewBoard->posArray[iPosStart] = -1;
pNewBoard->posArray[iPosFinish] = iPiece;

//NewBoard.posArray[iPosStart] = -1;
//NewBoard.posArray[iPosFinish] = iPiece;

// Now account for any pieces that were jumped, if applicable.
if(pJumpArray != NULL)
{
    for(int i = 0; i < 16; i++)
    {
        if(pJumpArray[i] != -1)
        {
            pNewBoard->posArray[pJumpArray[i]] = -1;
            //NewBoard.posArray[pJumpArray[i]] = -1;
        }
    }
}

// Connect the parent board to this child board.
pNewBoard->parent = pStartBoard;
//NewBoard.parent = pStartBoard;

//pStartBoard->children.push_back(_pTestState);

pStartBoard->children.push_back(pNewBoard); // <- The problem

//pStartBoard->children.push_back(&NewBoard);

}

余分なコメント部分は、他のアイデアが機能するかどうかを確認するために試していた場所です。

残念ながら、これによりプログラムは次のエラーをスローします。

アクセス違反読み取り場所 0xcdcdcdd1。

デバッガーを掘り下げると、STL リスト ファイルで問題が発生していることがわかりました。これらは、コール スタックの上位 3 つの呼び出しです。

OpenGL_Engine_Test1.exe!std::list >::_Insert(std::list >::_Const_iterator<1> _Where=..., tagBoardState * const & _Val=0x049a1a80) 行 718 + 0x10 バイト C++

OpenGL_Engine_Test1.exe!std::list<tagBoardState *,std::allocator<tagBoardState *> >::push_back(tagBoardState * const & _Val=0x049a1a80)  Line 670 + 0x51 bytes  C++

OpenGL_Engine_Test1.exe!MakeBoard(tagBoardState * pStartBoard=0x049a0580, int iPiece=16, int iPosStart=21, int iPosFinish=16, int * pJumpArray=0x00000000)  Line 352    C++

次に、list が定義されているファイルを開き、_insert 関数内の問題行を指摘します。

void _Insert(const_iterator _Where, const _Ty& _Val) { // _Val を _Where に挿入します

#if _HAS_ITERATOR_DEBUGGING if (_Where._Mycont != this) _DEBUG_ERROR("list insert iterator outside range"); #endif /* _HAS_ITERATOR_DEBUGGING */

    _Nodeptr _Pnode = _Where._Mynode();
    _Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val); // PROBLEM
    _Incsize(1);
    _Prevnode(_Pnode) = _Newnode;
    _Nextnode(_Prevnode(_Newnode)) = _Newnode;
    }

これ以上、私は本当に知りません。なぜこの問題が発生しているのかわかりません。「アクセス違反」とは、基本的に、存在しないものにアクセスしようとしている、アクセスできない、または何らかのスコープの問題があることを意味することを知っていますが、どのようにのいずれかが該当します。

誰かが私を正しい方向に向けることができれば、本当に感謝しています. 私は多くの検索を行いましたが、見つけたほとんどすべてがベクトルに関連しており、正確に私の問題ではないようです.

4

2 に答える 2

6

C++ クラスを malloc() すると、問題ベクトルを含め、そのクラスのフィールドのいずれに対してもコンストラクターは呼び出されません。新しいものを使用する必要があります。

pStartBoard が pNewBoard と同じように割り当てられていると仮定しましたが、そうでなくても pNewBoard で同じ問題が発生します。

于 2011-10-08T05:15:52.397 に答える
0

アクセス違反読み取り場所 0xcdcdcdd1。単位化された変数を示します。デバッガーは、そのような値をマーカーとして挿入します。残念ながら、エラーが発生している場所やコード サンプルの STL コンテナーを推測することはできません。しかし、「pNewBoard->posArray」は最初に探す場所です。そのクラスのコンストラクターはそのメンバーを何かに設定しますか?

于 2011-10-08T05:19:47.363 に答える