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;
    }
}

}

当我运行 exe 文件时,它会打开一个错误消息框,指出 vector iterator not dereferencable 。这是什么意思 ?

4

2 回答 2

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

you cann't do this *xIter or *yIter.

Returns an iterator referring to the past-the-end element in the vector container.

The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.

Because the ranges used by functions of the standard library do not include the element pointed by their closing iterator, this function is often used in combination with vector::begin to specify a range including all the elements in the container.

If the container is empty, this function returns the same as vector::begin.

于 2013-06-04T07:25:23.730 回答
3

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

于 2013-06-04T07:34:36.483 回答