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

[C++] Modyfikacja zmiennych klasy w funkcji w niej zawartej - dziwne zachowanie

Ostatnio zmodyfikowano 2018-04-14 16:21
Autor Wiadomość
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ć.
C/C++
class characterActor
    : public Actor
{
public:
    int direction = 1; //8 rotations, counting counter-clockwise. Range is 1-8. 1 - v 2 - v>
    std::string action = "I"; //I-idle W-walk A-attack D-die C-critHit
    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 ); //Odczepić się od tego
    }
    void update()
    {
        std::cout << "Update---\n";
        if( !plannedPath.empty() )
        {
            action = "W";
            //Set direction
            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"; //TUTAJ program się wywala, SIGSEGV segmentation fault
        }
       
        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ś?
P-170655
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.
P-170656
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.
P-170663
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
P-170667
« 1 »
  Strona 1 z 1