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: 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: 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: 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 );
|
|
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ę: sf::Vertex * quad = & vertices[ j * 4 ];
|
|
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? |
|
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. |
|
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 |
|
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. |
|
BraveRat Temat założony przez niniejszego użytkownika |
» 2020-09-06 11:03:57 Ok |
|
« 1 » |