Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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

Ostatnio zmodyfikowano 2020-09-06 11:03
Autor Wiadomość
BraveRat
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
DejaVu
» 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
BraveRat
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
pekfos
» 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
BraveRat
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
pekfos
» 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
BraveRat
Temat założony przez niniejszego użytkownika
» 2020-09-06 11:03:57
Ok
P-177505
« 1 »
  Strona 1 z 1