2015-10-17 52 views
0
bool GameUtil::isValidPath(std::vector<int>& path, Player* player, Game* game) { 
    ///**Get borad*/ 
    std::vector<Square*> board = game->getBoard(); 
    int maxDistanceTravel = 0; 
    int playerCanTravel = 0; 
    //first square and last square must be present 
    if (path[0] == 0 && path[path.size() - 1] == (board.size() - 1)) { 
     for (int i = 0; i < path.size() - 1; i++) { 
      /**Max distance of each board from player*/ 
      maxDistanceTravel = compute(board.at(path[i]), player); 
      playerCanTravel = path[i + 1] - path[i]; 
      if ((playerCanTravel > maxDistanceTravel) && (playerCanTravel <= 0)) { 
       return false; 
      } 
     } 
     return true; 
    } 
    return false; 
} 

我是一个新的C++学习者的实例后主动终止叫,我一遍又一遍的得到同样的错误,但无法弄清楚什么是错的,这显然没有超出范围,请帮助,谢谢。不断抛出“的std :: out_of_range”

+1

首先在调试器中运行以捕获异常,并找到您的代码抛出的位置。然后看看正在使用的索引,你会发现它超出了界限。 –

+0

我该如何调试这段代码? – Aaron

+0

所以你在哪一行得到一个错误?如果你没有调试器,你可以先注释掉一些你的代码。打印路径和纸板的大小。 – artsylar

回答

0

我会先尝试做一些早期检查,以确保您的输入是有效的。也许像这样:

bool GameUtil::isValidPath(std::vector<int>& path, Player* player, Game* game) { 
    assert(!path.empty()); 
    if (path.size() < 2) return false; // or whatever your minimum size is. 

只要你在它,你应该擦洗其他投入。

bool GameUtil::isValidPath(std::vector<int>& path, Player* player, Game* game) { 
    assert(!path.empty()); 
    assert(game); 
    assert(player); 
    if (path.size() < 2) return false; // or whatever your minimum size is. 

我有一个经验法则来使用不应该为null的参数的引用。它看起来像在你的代码中,游戏不允许为空。因此,也许你可以改变功能:

bool GameUtil::isValidPath(std::vector<int>& path, Player& player, Game& game) { 
    assert(!path.empty()); 
    if (path.size() < 2) return false; // or whatever your minimum size is. 

然后改变你打电话的地方。因此,在你的代码可能是你碰到这样的:

// somewhere buried in your code: 
Game * myGame = .../// however you created it. 
Game * myPlayer = .../// however you created it. 
GameUtil * myGameUtil = .../// however you created it. 
... 
auto isValid = myGameUtil->isValidPath(path, myPlayer, myGame); 

将其更改为:

// somewhere buried in your code: 
Game * myGame = .../// however you created it. 
Game * myPlayer = .../// however you created it. 
GameUtil * myGameUtil = .../// however you created it. 
... 
auto isValid = myGameUtil->isValidPath(path, *myPlayer, *myGame); 

希望有所帮助。

+0

好的,我会尽力谢谢你 – Aaron

相关问题