Vector subscript out of range, klasa sfml oparta na sf vertex
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Vector subscript out of range, klasa sfml oparta na sf vertex

AutorWiadomość
Temat założony przez niniejszego użytkownika
Vector subscript out of range, klasa sfml oparta na sf vertex
» 2020-09-04 22:12:57
Witam ostatnio próbuję napisać klasę która z tekstury wycięłaby fragmenty i ułożyła z nich postać. Kiedy jednak kompiluję kod napisany poniżej wyrzuca komunikat vector subscript out of range. W którym miejscu popełniłem błąd?
plik h:
C/C++
class Creature
    : public sf::Drawable
     , public sf::Transformable
{
public:
    sf::Texture parts;
    bool load( sf::Vector2u creatureSize, sf::Vector2i * rectMove, sf::Vector2i * partsMove, int parts, sf::Vector2i * rect );
   
private:
   
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
    {
        states.transform *= getTransform();
       
        states.texture = & parts;
       
        target.draw( vertices, states );
    }
   
    sf::VertexArray vertices;
   
};
plik cpp:
C/C++
bool Creature::load( sf::Vector2u creatureSize, sf::Vector2i * rectMove, sf::Vector2i * partsMove, int parts, sf::Vector2i * rect )
{
    vertices.setPrimitiveType( sf::Quads );
    vertices.resize( parts );
   
    for( unsigned int j = 0; j < parts; j++ )
    {
       
        sf::Vertex * quad = & vertices[ j * 4 ];
       
        quad[ 0 ].position = sf::Vector2f( partsMove[ j ].x, partsMove[ j ].y );
        quad[ 1 ].position = sf::Vector2f( partsMove[ j ].x * 2, partsMove[ j ].y );
        quad[ 2 ].position = sf::Vector2f( partsMove[ j ].x * 2, partsMove[ j ].y * 2 );
        quad[ 3 ].position = sf::Vector2f( partsMove[ j ].x, partsMove[ j ].y * 2 );
       
        quad[ 0 ].texCoords = sf::Vector2f( rectMove[ j ].x, rectMove[ j ].y );
        quad[ 1 ].texCoords = sf::Vector2f( rectMove[ j ].x + rect[ j ].x, rectMove[ j ].y );
        quad[ 2 ].texCoords = sf::Vector2f( rectMove[ j ].x + rect[ j ].x, rectMove[ j ].y + rect[ j ].y );
        quad[ 3 ].texCoords = sf::Vector2f( rectMove[ j ].x, rectMove[ j ].y + rect[ j ].y );
    }
   
    return true;
}
I w mainie:
C/C++
sf::Vector2i rectMove[] =
{
    sf::Vector2i( 0, 0 ), sf::Vector2i( 61, 178 ), sf::Vector2i( 57, 76 ), sf::Vector2i( 127, 76 ), sf::Vector2i( 58, 0 ),
};
sf::Vector2i partsMove[] =
{
    sf::Vector2i( 10, 0 ), sf::Vector2i( 0, 50 ), sf::Vector2i( 10, 30 ), sf::Vector2i( 10, 70 ), sf::Vector2i( 0, 40 ),
};
sf::Vector2i rect[] =
{
    sf::Vector2i( 58, 76 ), sf::Vector2i( 62, 111 ), sf::Vector2i( 70, 102 ), sf::Vector2i( 59, 88 ), sf::Vector2i( 62, 75 ),
};
Creature Hero1;
Hero1.parts.loadFromFile( "Hero1.png" );
Hero1.load( sf::Vector2u( 185, 289 ), rectMove, partsMove, 5, rect );
Hero1.setPosition( 500, 100 );
P-177496
» 2020-09-05 09:35:20
Odpal sobie kod w debuggerze to wskaże Ci on linijkę, w której wychodzisz poza zakres std::vector.

Debugger zapewne wskaże ci tą linijkę:
C/C++
sf::Vertex * quad = & vertices[ j * 4 ]; //tu wychodzisz poza zakres
P-177497
Temat założony przez niniejszego użytkownika
» 2020-09-05 15:09:17
Debuger podawał linijkę 1733 ale w żadnym z plików nie było aż tyle wierszy, jak on to liczy?
P-177498
» 2020-09-05 17:32:53
Ta 1733 linia to była w jakim pliku? Dostałeś tam też co najmniej nazwę pliku, nie ma samego numeru linii.
P-177499
Temat założony przez niniejszego użytkownika
» 2020-09-05 18:44:48
To jest osobne okno które pokazuje:

Program: (wypisana lokalizacja całego projektu)
File: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\include\vector
Line: 1733

Expression: vector subscript out of range
P-177500
» 2020-09-05 19:09:42
No to o co chodzi? Wyraźnie widać że problem wystąpił w implementacji wektora. Gdzieś tam będziesz mieć call stack z którego możesz odczytać jak program doszedł do tego punktu. Pewnie masz to nawet na ekranie gdy program się sypie, bo to jedna z najbardziej podstawowych informacji. Jeśli jakimś cudem tego nie ma, to możesz włączyć ten widok w menu Debug/Windows/Call Stack.
P-177501
Temat założony przez niniejszego użytkownika
» 2020-09-06 11:03:57
Ok
P-177505
« 1 »
 Strona 1 z 1