Как исправить ошибку отладки утверждения? - PullRequest
0 голосов
/ 27 апреля 2019

Я создаю игру Tic-Tac-Toe, используя тот же код, который был предоставлен Sonar Systems в учебнике Tic-Tac-Toe SFML C ++ [STATE CREATION]. Но игра не запускается, и вместо этого я получаю окно с сообщением о том, что утверждение отладки не выполнено, и в окне вывода выдается исключение, говорящее: не может отойти от итератора deque диапазона, и (иногда не всегда), когда я пытаюсь запустить его снова в окне вывода есть это дополнительное сообщение «Недопустимый параметр передан функции, которая считает недопустимые параметры фатальными»

Я установил sfml, и он успешно связан с моим проектом VS2017, все необходимые ресурсы включены с основным в файле проекта, и я убедился, что все пути к каталогам верны. Я исправил первоначальные 86 ошибок (в том числе дополнительные файлы заголовков), и на данный момент нет красного подчеркивания кода, только появляется это окно сообщения.

Это минимальный объем кода, вызывающий ту же проблему:

main.cpp

#include "pch.h"
#include <iostream>
#include "Game.h"

int main()
{
    TicTacToe::Game(800, 600, "Tic-Tac-Toe Game");
    return EXIT_SUCCESS;
}

Game.cpp

#include "pch.h"
#include "Game.h"

namespace TicTacToe
{
    Game::Game(int width, int height, std::string title)
    {
        _data->window.create(sf::VideoMode(width, height), title, sf::Style::Close | sf::Style::Titlebar);

        this->Run();
    }

    void Game::Run()
    {
        float newTime, frameTime, interpolation;
        float currentTime = this->_clock.getElapsedTime().asSeconds();
        float accumulator = 0.0f;
        while (this->_data->window.isOpen())
        {
            this->_data->machine.ProcessStateChanges();
            newTime = this->_clock.getElapsedTime().asSeconds();
            frameTime = newTime - currentTime;

            if (frameTime > 0.25f)
            {
                frameTime = 0.25f;
            }

            currentTime = newTime;
            accumulator += frameTime;

            while (accumulator >= dt)
            {
                this->_data->machine.GetActiveState()->HandleInput();
                this->_data->machine.GetActiveState()->Update(dt);

                accumulator -= dt;
            }

            interpolation = accumulator / dt;
            this->_data->machine.GetActiveState()->Draw(interpolation);
        }
    }
}

Game.h

#pragma once
#include <memory>
#include <string>
#include <SFML\Graphics.hpp>
#include "StateMachine.h"

namespace TicTacToe
{
    struct GameData
    {
        StateMachine machine;
        sf::RenderWindow window;
    };

    typedef std::shared_ptr<GameData> GameDataRef;

    class Game
    {
    public:
        Game(int width, int height, std::string title);
    private:
        const float dt = 1.0f / 60.0f;
        sf::Clock _clock;

        GameDataRef _data = std::make_shared<GameData>();

        void Run();
    };
}

StateMachine.cpp

#include "pch.h"
#include "StateMachine.h"

namespace TicTacToe
{
    void StateMachine::AddState(StateRef newState, bool isReplacing)
    {
        this->_isAdding = true;
        this->_isReplacing = isReplacing;

        this->_newState = std::move(newState);
    }

    void StateMachine::RemoveState()
    {
        this->_isRemoving = true;
    }

    void StateMachine::ProcessStateChanges()
    {
        if (this->_isRemoving && !this->_states.empty())
        {
            this->_states.pop();

            if (!this->_states.empty())
            {
                this->_states.top()->Resume();
            }

            this->_isRemoving = false;
        }

        if (this->_isAdding)
        {
            if (!this->_states.empty())
            {
                if (this->_isReplacing)
                {
                    this->_states.pop();
                }
                else
                {
                    this->_states.top()->Pause();
                }
            }

            this->_states.push(std::move(this->_newState));
            this->_states.top()->Init();
            this->_isAdding = false;
        }
    }

    StateRef &StateMachine::GetActiveState()
    {
        return this->_states.top();
    }
}

StateMachine.h

#include "pch.h"
#include "StateMachine.h"

namespace TicTacToe
{
    void StateMachine::AddState(StateRef newState, bool isReplacing)
    {
        this->_isAdding = true;
        this->_isReplacing = isReplacing;

        this->_newState = std::move(newState);
    }

    void StateMachine::RemoveState()
    {
        this->_isRemoving = true;
    }

    void StateMachine::ProcessStateChanges()
    {
        if (this->_isRemoving && !this->_states.empty())
        {
            this->_states.pop();

            if (!this->_states.empty())
            {
                this->_states.top()->Resume();
            }

            this->_isRemoving = false;
        }

        if (this->_isAdding)
        {
            if (!this->_states.empty())
            {
                if (this->_isReplacing)
                {
                    this->_states.pop();
                }
                else
                {
                    this->_states.top()->Pause();
                }
            }

            this->_states.push(std::move(this->_newState));
            this->_states.top()->Init();
            this->_isAdding = false;
        }
    }

    StateRef &StateMachine::GetActiveState()
    {
        return this->_states.top();
    }
}

State.h

#pragma once
namespace TicTacToe
{
    class State
    {
    public:
        virtual void Init() = 0;
        virtual void HandleInput() = 0;
        virtual void Update(float dt) = 0;
        virtual void Draw(float dt) = 0;
        virtual void Pause() { }
        virtual void Resume() { }


    };
}

А из окна стека вызовов это строки, в которых происходит сбой:

StateMachine.cpp (строки 53-56)

StateRef &StateMachine::GetActiveState()
    {
        return this->_states.top();
    }

Game.cpp (строка 41)

this->_data->machine.GetActiveState()->Draw(interpolation);

Game.cpp (строки 6-11)

Game::Game(int width, int height, std::string title)
    {
        _data->window.create(sf::VideoMode(width, height), title, sf::Style::Close | sf::Style::Titlebar);

            this->Run();
    }

main.cpp (строка 7)

TicTacToe::Game(800, 600, "Tic-Tac-Toe Game");

Я не знаю, может ли это быть полезным, но на всякий случай я также получаю в окне вывода, что некоторые файлы PDB не могут быть найдены или открыты, поэтому я попытался исправить это, и он загрузил некоторые из них, но есть еще некоторые, которые не загружаются.

P.S. Я новичок в программировании

...