rafallauterbach Temat założony przez niniejszego użytkownika |
Segmentation fault - używanie int64_t w klasie » 2019-01-22 12:57:40 Cześć, wywołując pay(P0,100); otrzymuję segmentation fault próbując zdobyć informacje zawarte w zmiennej 64 bitowej. Przepatrzyłem już ten kod kilka razy i nie rozumiem dlaczego tak się dzieje... Nie wiem też, czy sposób w jaki usuwam playera jest rozsądny... ale to już nie dotyczy tematu i poradzę sobie z nim w razie potrzeby, ale w czasie wykonywania programu nie usuwam żadnego playera, więc nie powinno mieć to wpływu. Player.h #ifndef PLAYER_H #define PLAYER_H #include <SDL2/SDL.h> #include <string> #include <vector> #include "Object.h"
class Player { public: Player(); Player( std::string name ); ~Player(); SDL_Color get_color() { return color; } void set_color( SDL_Color val ) { color = val; } std::string get_name() { return name; } void set_name( std::string val ) { name = val; } bool pay( Player *, uint64_t ); bool pay( Player *, uint64_t, bool ); uint64_t get_money(); uint64_t get_money( unsigned int ); void print_money(); static Player * get_active_player(); Object * money_print; protected: private: static std::vector < Player *> all_players; static Player * active; SDL_Color color; std::string name; uint64_t money; };
#endif
Player.cpp #include "Player.h"
#include <Game.h> #include <string>
Player * Player::active; std::vector < Player *> Player::all_players;
Player::Player() { money = 0; if( Player::all_players.size() == 0 ) color = { .r = 0, .g = 0, .b = 0, .a = 0 }; else color = { .r = Game::get_random( 255 ), .g = Game::get_random( 255 ), .b = Game::get_random( 255 ), .a = 255 }; name = "player " +( all_players.size() ); all_players.push_back( this ); }
Player::~Player() { for( unsigned int i = 0; i < all_players.size(); i++ ) if( all_players[ i ] == this ) all_players.erase( all_players.begin() + i ); }
bool Player::pay( Player * target, uint64_t check, bool force ) { std::cout << "test 1 : " << std::endl; std::cout << check << std::endl; std::cout << money << std::endl; std::cout <<(( bool ) money >= check ) << std::endl; if( force or money >= check ) { std::cout << "test OK" << std::endl; money -= check; print_money(); target->get_money( check ); return true; } else return false; }
bool Player::pay( Player * target, uint64_t check ) { return pay( target, check, false ); }
uint64_t Player::get_money() { return money; }
uint64_t Player::get_money( unsigned int val ) { money += val; print_money(); return get_money(); }
void Player::print_money() { if( money_print != nullptr ) money_print->set_caption( std::to_string( money ) ); }
Player * Player::get_active_player() { return nullptr; }
Chyba nigdzie indziej nie mogę "zepsuć" zmiennej, bo jest ona private i klasa nie ma fiend-ów, tak więc zepsucie musi się dokonywać gdzieś tutaj, w getterze setterze, albo czymś w tej klasie. |
|
darko202 |
» 2019-01-22 14:08:38 |
|
rafallauterbach Temat założony przez niniejszego użytkownika |
» 2019-01-22 14:38:27 Ok, prześledziłem całą gałąź include-ów i nie mam tam nigdzie cstdint, dodałem tą bibliotekę, ale niczego to nie polepszyło ani nie pogorszyło. W google już szukałem takiego tematu (i poszukałem ponownie właśnie teraz), ale najczęściej ktoś ma problem z przekraczaniem wielkości tablicy, albo z dereferencją wskaźnika i najczęściej ich problem dotyczy innego błędu. Są też odniesienia do przekraczania pojemności stosu, ale przyznam, że nie mam pojęcia jak to sprawdzić. |
|
pekfos |
» 2019-01-22 16:50:11 Podałeś za mało kodu. Strzelam że jest tam gdzieś coś takiego: i wsk jest błędnym wskaźnikiem. |
|
rafallauterbach Temat założony przez niniejszego użytkownika |
» 2019-01-22 17:06:40 Och! Używam get_active_player() żeby zdobyć playera... A jak widać zwraca on nullptr. Tymczasowe rozwiązania nie zawsze popłacają :/ bardzo głupi błąd wyszedł. Wcześniej get_active_player() zwracał 2giego playera z tablicy, ale zmieniłem to na null i zająłem się czymś innym, zapomniałem co robił get_active_player() i stwierdziłem, że jest to metoda której szukam. |
|
rafallauterbach Temat założony przez niniejszego użytkownika |
» 2019-01-22 17:07:59 źródło problemu : if( event.button.button == SDL_BUTTON_LEFT ) { if( Tile::selected->get_owner() == P1 ) { if( Tile::selected->have_unit == true ) { } else { if( Player::get_active_player()->pay( Pzero, 100 ) ) Tile::selected->have_unit = true; } } } if( event.button.button == SDL_BUTTON_RIGHT ) { if( Tile::selected->get_owner() == P1 ) { if( Tile::selected->get_city_lvl() == 1 ) { ; } else { if( Player::get_active_player()->pay( Pzero, 1000 ) ) Tile::selected->build_city(); } } }
|
|
« 1 » |