C++ 为什么我的程序有一个实例;向量下标超出范围“;?

C++ 为什么我的程序有一个实例;向量下标超出范围“;?,c++,sfml,C++,Sfml,基本上,我的代码应该是从main() 然后,程序将根据向量的顺序给出向量的cordinate,如果纹理的cordinate为#1,则给出纹理的cordinate。基于我的cout语句tiletype=tt[count]从int tt[]读取第五个零后,我可以判断程序崩溃,并给出错误向量下标超出范围 我假设问题属于我代码的这一部分: for(x = 1; x < c;++x) { for(y = 0; y < r;++y) { tiletyp

基本上,我的代码应该是从
main()

然后,程序将根据向量的顺序给出向量的cordinate,如果纹理的cordinate为#1,则给出纹理的cordinate。基于我的cout语句
tiletype=tt[count]
int tt[]
读取第五个零后,我可以判断程序崩溃,并给出错误
向量下标超出范围

我假设问题属于我代码的这一部分:

  for(x = 1; x < c;++x)
    {
    for(y = 0; y < r;++y)
    {
        tiletype = tt[count];
        cout <<tiletype<<", ";
            vertices[a].position = sf::Vector2f((0+y)*ts,ts*(x+1)+80);
            vertices[b].position = sf::Vector2f((0+y)*ts, (0+x)*ts+80);
            vertices[d].position = sf::Vector2f(ts+(y*ts),(0+x)*ts+80);
            vertices[e].position = sf::Vector2f(ts+(y*ts), ts*(x+1)+80);
            vertices[a].texCoords = mapcords(tiletype,0);
            vertices[b].texCoords = mapcords(tiletype,1);
            vertices[d].texCoords = mapcords(tiletype,2);
            vertices[e].texCoords = mapcords(tiletype,3);
            a += 4; b += 4; d += 4; e += 4;count++;
    }
    row += 1;
    cout <<endl<<"Row "<<row<<": "; y = 0;
    }
(x=1;x { 对于(y=0;ycout即使r和c正确初始化为(我假设)4,只要循环到
y=4
的点(即x是递增的)在第五个循环中,你没有重置a、b、d或e-意思,你有
a=16
b=17
d=19
e=20
,但是你仍然尝试访问
顶点[a]
(以及b和d和e)。因为在这之前顶点的大小被调整为
(2*2*4)
或16,然后访问超出其边界的向量。因此,
向量下标超出范围
错误

为了保持足够的顶点以容纳4*个要放入向量的平铺数,需要执行以下操作:

vertices.resize(4 * r * c);

请去掉一个字母的变量名,这会让代码很难理解!现在我想了想,如果你想让每个平铺都有四个顶点(tt中的每种类型都有一个平铺),你实际上需要更多的空间——可能类似于
顶点。调整大小(4*r*c);
。编辑答案。。。
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace std;
using namespace sf;
Vector2f mapcords(int tt,int corner);
Vector2f mapcords(int tt,int corner)
{
if(tt ==0)
{
    if (corner ==1)
    {return Vector2f(48,8 );}
    if(corner == 1)
    {return Vector2f(48,0);}
    if (corner ==2)
    {return Vector2f(56, 0);}
    if (corner == 3)
    {return sf::Vector2f(56, 8);}
}
else{
    if(corner ==0)
    {return Vector2f(0,8 );}
    if(corner == 1)
    {return Vector2f(0,0);}
    if (corner ==2)
    {return Vector2f(8, 0);}
    if (corner == 3)
    {return sf::Vector2f(8, 8);}
}
return Vector2f(0,0 );
}
class drawmap : public sf::Drawable, public sf::Transformable
{
public:
    bool load(const string& tileset,const int* tt, int ts, int r, int c, int num) 
    {
    count =0;   row =1;  a = 0;  b = 1;  d = 2;  e = 3;y=0;x=0;
        tiletex.setRepeated(true);
        if (!tiletex.loadFromFile(tileset))
            return false;
    tiletex.setRepeated(true);
    vertices.setPrimitiveType(sf::Quads);
    vertices.resize(2 * 2 * 4);
        cout <<endl<<"Row "<<row<<": ";
    for(x = 1; x < c;++x)
    {
    for(y = 0; y < r;++y)
    {
        tiletype = tt[count];
        cout <<tiletype<<", ";
            vertices[a].position = sf::Vector2f((0+y)*ts,ts*(x+1)+80);
            vertices[b].position = sf::Vector2f((0+y)*ts, (0+x)*ts+80);
            vertices[d].position = sf::Vector2f(ts+(y*ts),(0+x)*ts+80);
            vertices[e].position = sf::Vector2f(ts+(y*ts), ts*(x+1)+80);
            vertices[a].texCoords = mapcords(tiletype,0);
            vertices[b].texCoords = mapcords(tiletype,1);
            vertices[d].texCoords = mapcords(tiletype,2);
            vertices[e].texCoords = mapcords(tiletype,3);
            a += 4; b += 4; d += 4; e += 4;count++;
    }
    row += 1;
    cout <<endl<<"Row "<<row<<": "; y = 0;
    }
    return true;
    }
private:
        int row;
        int count;
    int y,x;
        int a,b,d,e;
        int tiletype;
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        states.transform *= getTransform();
        states.texture = &tiletex;
        target.draw(vertices, states);
    }
    sf::VertexArray vertices;
    sf::Texture tiletex;
};
vertices.resize(4 * r * c);