[C++] Modyfikacja zmiennych klasy w funkcji w niej zawartej - dziwne zachowanie
Ostatnio zmodyfikowano 2018-04-14 16:21
twoxu Temat założony przez niniejszego użytkownika |
[C++] Modyfikacja zmiennych klasy w funkcji w niej zawartej - dziwne zachowanie » 2018-04-14 01:45:53 Witam. Mam klasę characterActor, w której mam fukcję update(). Ze względu na budowę mojej gry, poszczególne animacje są określane literą oznaczającą animację, i liczbą oznaczającą rotację. W funkcji update() oczywiście muszę modyfikować zmienne zawarte w klasie, ale jakoś mi to nie chce działać. class characterActor : public Actor { public: int direction = 1; std::string action = "I"; int speed; int health; bool isAlive; AnimatedSprite animSprite; int triggerRadius; std::vector < sf::Vector2i > plannedPath; void setPath( int dx, int dy ) { plannedPath = Pathfind(( int ) posx / 10,( int ) posy / 10,( int ) dx / 10,( int ) dy / 10 ); } void update() { std::cout << "Update---\n"; if( !plannedPath.empty() ) { action = "W"; if( plannedPath[ 0 ].x < posx ) { if( plannedPath[ 0 ].y < posy ) direction = 8; if( plannedPath[ 0 ].y == posy ) direction = 7; if( plannedPath[ 0 ].y > posy ) direction = 6; } if( plannedPath[ 0 ].x == posx ) { if( plannedPath[ 0 ].y < posy ) direction = 5; if( plannedPath[ 0 ].y == posy ) direction = 1; if( plannedPath[ 0 ].y > posy ) direction = 4; } if( plannedPath[ 0 ].x > posx ) { if( plannedPath[ 0 ].y < posy ) direction = 3; if( plannedPath[ 0 ].y == posy ) direction = 2; if( plannedPath[ 0 ].y > posy ) direction = 1; } posx = plannedPath[ 0 ].x; posy = plannedPath[ 0 ].y; plannedPath.erase( plannedPath.begin() ); } if( plannedPath.empty() ) { action = "I"; } animSprite.setAnim( action + std::to_string( direction ) ); std::cout << action + std::to_string( direction ) << std::endl; animSprite.nextFrm(); sprite = animSprite.sprite; } };
Jak widać program się wywala podczas próby zmiany zmiennej wewnątrz instancji klasy. Coś, ktoś? |
|
RazzorFlame |
» 2018-04-14 09:51:58 Prawie na pewno błąd nie powoduje ta linia. Skompiluj w trybie Debug i pokaż gdzie się wywala podczas uruchamiania debuggerem. |
|
twoxu Temat założony przez niniejszego użytkownika |
» 2018-04-14 15:43:47 Debugger nie pokazuje gdzie zachodzi SIGSEGV, więc bardzo niekulturalnie dodałem std::cout przed i po tej linii. Po wyświetleniu pierwszej wiadomości program crashuje. |
|
RazzorFlame |
» 2018-04-14 16:21:45 To daj też std::cout od razu po tej linii, żeby wiedzieć, czy program nie przechodzi gdzieś dalej, zanim się crashuje. Jeśli nie pokazuje Ci, gdzie wystąpił crash, to pewnie nie kompilujesz w trybie debug. Jeśli jednak to robisz, to najprawdopodobniej wina GDB (debugera od GCC). Mnie kiedyś też to denerwowało, nic mi nie pokazywał. Debuger Visual Studio jest najlepszym co mnie spotkało, Tobie też polecam. Jeśli nie masz zamiaru się przenosić na VS, to ściągnij przynajmniej jedną z nowszych wersji kompilatora + Code::Blocks. Może to pomoże: Instalacja Code Blocks/GCC 7.2.0 | YouTube |
|
« 1 » |