2013-06-04 194 views
0

我正在寫一個基於Allegro的蛇遊戲,並且有一個包含蛇部分座標的向量的問題。向量迭代器錯誤

這是刪除蛇的最後一個元素並添加一個新元素的函數。 以前我宣佈vector <int> snake_x ; vector <int> snake_y;,我也推回了向量中所需的數字。

void moove_snake(int direction){ 
switch (direction){ 
    case UP: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter); 
     snake_y.push_back(*yIter-20); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break; 
    } 
    case DOWN: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter); 
     snake_y.push_back(*yIter+20); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break; 
    } 
    case LEFT: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter-20); 
     snake_y.push_back(*yIter); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break;  
    } 
    case RIGHT: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter+20); 
     snake_y.push_back(*yIter); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break; 
    } 
} 

}

當我運行它會打開一個錯誤消息框,說矢量迭代器不dereferencable的exe文件。這是什麼意思 ?

回答

3
xIter=snake_x.end(); 
    yIter=snake_y.end(); 

你不能這樣做* xIter或* yIter。

返回引用矢量容器中過去結束元素的迭代器。

過去結束的元素是遵循向量中最後一個元素的理論元素。它不指向任何元素,因此不應被解除引用。

由於標準庫函數使用的範圍不包括其關閉迭代器指向的元素,因此此函數通常與vector :: begin結合使用以指定包含容器中所有元素的範圍。

如果容器爲空,則此函數返回與vector :: begin相同的結果。

3

您應該使用vector.back()而不是vector.end(),vector.back()將引用返回到向量末尾的值。 或者,您可以使用vector.at(vector.size() - 1)或與vector[vector.size() - 1]相同