2015-10-17 133 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

相關問題