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

Segmentation fault - używanie int64_t w klasie

Ostatnio zmodyfikowano 2019-01-22 17:07
Autor Wiadomość
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
C/C++
#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
    uint64_t money;
   
};

#endif // PLAYER_H

Player.cpp
C/C++
#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;
   
    //(!) Segmentation fault po poprawnym wyświetleniu wartości zmiennej check przed wyświetleniem wartości money
    //kontynuacja pliku .cpp
    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.
P-173647
darko202
» 2019-01-22 14:08:38
1.
dla typu uint64_t na
https://en.cppreference.com/w​/cpp/types/integer
jest "Defined in header <cstdint>"
 
W twoim kodzie nie widzę tego nagłówka

uzasadnione wydaje się pytanie skąd wiec bierzesz ten typ ?

2.
poszukaj "segmentation fault cout c++ uint64_t"
na
https://www.google.pl/search​?ei=BBdHXNuxCYT7swHOr6qADw​&q=segmentation+fault+cout+c%2​B%2B+uint64_t​&oq=segmentation+fault+cout+c%​2B%2B+uint64_t​&gs_l=psy-ab.3...64945.67505..67871...0.0..0.61.163.3......0....1..gws-wiz.MEGWW35DD0A
P-173648
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ć.
P-173649
pekfos
» 2019-01-22 16:50:11
Podałeś za mało kodu. Strzelam że jest tam gdzieś coś takiego:
C/C++
wsk->pay( P0, 100 );
i wsk jest błędnym wskaźnikiem.
P-173651
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.
P-173652
rafallauterbach
Temat założony przez niniejszego użytkownika
» 2019-01-22 17:07:59
źródło problemu :
C/C++
if( event.button.button == SDL_BUTTON_LEFT )
{
    if( Tile::selected->get_owner() == P1 )
    {
        if( Tile::selected->have_unit == true )
        {
            //unit selected blinking or sthing
        }
        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 )
        {
            ; //do nothing
        }
        else
        {
            if( Player::get_active_player()->pay( Pzero, 1000 ) )
                 Tile::selected->build_city();
           
        }
    }
}
P-173653
« 1 »
  Strona 1 z 1