Segmentation fault

di il
16 risposte

Segmentation fault

Ciao a tutti! Ho creato un vettore leggendo da un file ma quando provo a passare il suo indirizzo attraverso una funzione a un'altra classe ho segmentation fault. Qualcuno ha idea di quale possa essere il motivo?


vector <Monster> *Fighter:: return_monsters(){
return &_monsters;
}


void Game:: associate_monster_f(){
Fighter f;
vector<Monster> *tmp;
tmp=f.return_monsters();
for(unsigned int j=0; j<tmp->size();++j ){
for(unsigned int i=0; i<_player.size();++i ){
if(_player.ID_monster()==tmp->at(j).ID() ){
_monster_list_f.push_back(tmp->at(j));
}
}
}
}

16 Risposte

  • Re: Segmentation fault

    vector <Monster> *Fighter:: return_monsters(){
      return &_monsters;
    }
    
    void Game:: associate_monster_f(){
    Fighter f1;
    vector<Monster> *tmp;
    tmp=f1.return_monsters();
    for(unsigned int j=0; j<tmp->size();++j ){
      for(unsigned int i=0; i<_player.size();++i ){
        if(_player[i].ID_monster()==tmp->at(j).ID() ){
            _monster_list_f.push_back(tmp->at(j));
        }
    }
    }
    }
    // il codice di questa funzione è molto lungo quindi ho messo solo la parte interessata
    
    void Game:: start(){
        associate_monster_f();
        _attack_f=_f->choose_attack(    (associate_attack_f(_monster_list_f[_indicator_monster_f].ID())));   
    }
    //il segmentation fault me lo da nell'ultima riga di codice e mi rimanda a questa funzione
    
    int Monster::ID()const{
         return _ID;
    }
    
    
  • Re: Segmentation fault

    ultrasound91 ha scritto:


    Possibilmente dacci il codice completo per una verifica più immediata.
    Poi, carica il codice usando i tag CODE, come nel seguento esempio:
    
    
    vector <Monster> *Fighter:: return_monsters(){
        return &_monsters;
    }
    
    
    void Game:: associate_monster_f(){
        Fighter f;
        vector<Monster> *tmp;
        tmp=f.return_monsters();
        for(unsigned int j=0; j<tmp->size();++j ){
            for(unsigned int i=0; i<_player.size();++i ){
                if(_player[i].ID_monster()==tmp->at(j).ID() ){
                    _monster_list_f.push_back(tmp->at(j));
                }
            }
        }
    }
    
    
    vector <Monster> *Fighter:: return_monsters(){
      return &_monsters;
    }
    
    void Game:: associate_monster_f(){
    Fighter f1;
    vector<Monster> *tmp;
    tmp=f1.return_monsters();
    for(unsigned int j=0; j<tmp->size();++j ){
      for(unsigned int i=0; i<_player.size();++i ){
        if(_player[i].ID_monster()==tmp->at(j).ID() ){
            _monster_list_f.push_back(tmp->at(j));
        }
    }
    }
    }
    // il codice di questa funzione è molto lungo quindi ho messo solo la parte interessata
    
    void Game:: start(){
        associate_monster_f();
        _attack_f=_f->choose_attack(    (associate_attack_f(_monster_list_f[_indicator_monster_f].ID())));   
    }
    //il segmentation fault me lo da nell'ultima riga di codice e mi rimanda a questa funzione
    
    int Monster::ID()const{
         return _ID;
    }
    
  • Re: Segmentation fault

    ultrasound91 ha scritto:


    Manca il punto di ingresso del programma.
    Vuoi dire il main?
    
      Game g;
       g.read_file_team();
      g.start();
    
  • Re: Segmentation fault

    ultrasound91 ha scritto:


    Si esatto.
    Devi fare copia-incolla di tutto il codice dentro il file main.cpp.
    A meno che non devi brevettare il tuo programma e non vuoi farlo vedere.

    A parte che è lunghissimo perchè ci sono tante classi, è un homework di un corso universitario quindi non voglio rischiare che qualcuno lo copi.
    Non bastano solo i pezzi di codice interezzati?
  • Re: Segmentation fault

    ultrasound91 ha scritto:


    Non potevo sapere se si tratta di un programmino inventato al momento per esercizio o di un progetto per esame universitario o di un progetto per lavoro.
    Quindi rispetto e condivido la tua decisione.
    Proverò ad analizzare il codice che hai inviato.
    grazie
  • Re: Segmentation fault

    Se modifichi così:
    
    void Game:: start(){
        associate_monster_f();
        _attack_f=_f->choose_attack(    (associate_attack_f(_monster_list_f.at(_indicator_monster_f).ID())));   
    }
    
    Noterai che viene lanciata un'eccezione (cosa che non succede usando l'operatore[]).
    Il banale motivo risiede qui:
    
    void Game:: associate_monster_f(){
        Fighter f; 
        vector<Monster> *tmp;
        tmp=f.return_monsters(); // il vector però è vuoto se non è riempito dal costruttore di Fighter. 
    
        for(unsigned int j=0; j<tmp->size();++j ) { // quindi questo ciclo non sarà mai eseguito.
            for(unsigned int i=0; i<_player.size();++i ){
                if(_player[i].ID_monster()==tmp->at(j).ID() ){
                    _monster_list_f.push_back(tmp->at(j));
                }
            }
        }
    }
    
    e di conseguenza _monster_list_f è vuoto. Il che da l'errore di cui ti lamenti.
    N.B.
    Dato che _monsters non è un puntatore, invece di
    
    vector <Monster> *Fighter:: return_monsters(){
        return &_monsters;
    }
    
    puoi scrivere:
    
    vector <Monster>& Fighter:: return_monsters(){
        return _monsters;
    }
    
    risparmiando la sintassi dei puntatori in seguito (a meno di specifiche diverse, un pò forzate in questo caso).
  • Re: Segmentation fault

    shodan ha scritto:


    Se modifichi così:
    
    void Game:: start(){
        associate_monster_f();
        _attack_f=_f->choose_attack(    (associate_attack_f(_monster_list_f.at(_indicator_monster_f).ID())));   
    }
    
    Noterai che viene lanciata un'eccezione (cosa che non succede usando l'operatore[]).
    Il banale motivo risiede qui:
    
    void Game:: associate_monster_f(){
        Fighter f; 
        vector<Monster> *tmp;
        tmp=f.return_monsters(); // il vector però è vuoto se non è riempito dal costruttore di Fighter. 
    
        for(unsigned int j=0; j<tmp->size();++j ) { // quindi questo ciclo non sarà mai eseguito.
            for(unsigned int i=0; i<_player.size();++i ){
                if(_player[i].ID_monster()==tmp->at(j).ID() ){
                    _monster_list_f.push_back(tmp->at(j));
                }
            }
        }
    }
    
    e di conseguenza _monster_list_f è vuoto. Il che da l'errore di cui ti lamenti.
    N.B.
    Dato che _monsters non è un puntatore, invece di
    
    vector <Monster> *Fighter:: return_monsters(){
        return &_monsters;
    }
    
    puoi scrivere:
    
    vector <Monster>& Fighter:: return_monsters(){
        return _monsters;
    }
    
    risparmiando la sintassi dei puntatori in seguito (a meno di specifiche diverse, un pò forzate in questo caso).

    Grazie mille!
  • Re: Segmentation fault

    shodan ha scritto:


    Se modifichi così:
    
    void Game:: start(){
        associate_monster_f();
        _attack_f=_f->choose_attack(    (associate_attack_f(_monster_list_f.at(_indicator_monster_f).ID())));   
    }
    
    Noterai che viene lanciata un'eccezione (cosa che non succede usando l'operatore[]).
    Il banale motivo risiede qui:
    
    void Game:: associate_monster_f(){
        Fighter f; 
        vector<Monster> *tmp;
        tmp=f.return_monsters(); // il vector però è vuoto se non è riempito dal costruttore di Fighter. 
    
        for(unsigned int j=0; j<tmp->size();++j ) { // quindi questo ciclo non sarà mai eseguito.
            for(unsigned int i=0; i<_player.size();++i ){
                if(_player[i].ID_monster()==tmp->at(j).ID() ){
                    _monster_list_f.push_back(tmp->at(j));
                }
            }
        }
    }
    
    e di conseguenza _monster_list_f è vuoto. Il che da l'errore di cui ti lamenti.
    N.B.
    Dato che _monsters non è un puntatore, invece di
    
    vector <Monster> *Fighter:: return_monsters(){
        return &_monsters;
    }
    
    puoi scrivere:
    
    vector <Monster>& Fighter:: return_monsters(){
        return _monsters;
    }
    
    risparmiando la sintassi dei puntatori in seguito (a meno di specifiche diverse, un pò forzate in questo caso).
    Mi sai dire anche perché stampa i nomi due volte?
    void Game:: show_teams(){
       associate_monster_f();
       associate_monster_pc();
       //msg("mostri:");
       for(unsigned int i=0;i< _monster_list_f.size();++i){
        cout<<_monster_list_f.at(i).name()<<" ";
    
       }
       cout<<endl<<"CONTRO"<<endl;
       //msg("mostri:");
       for(unsigned int i=0;i< _monster_list_pc.size();++i){
        cout<<_monster_list_pc.at(i).name()<<" ";
    
       }
       cout<<endl;
    }
    
  • Re: Segmentation fault

    Cioè?
  • Re: Segmentation fault

    oregon ha scritto:


    Cioè?
    invece di stampare
    nome1 nome2 (riferiti a _monster_list_f)
    CONTRO
    nome1 nome2 (riferiti a _monster_list_pc)


    stampa
    nome1 nome2 nome1 nome2 ( di _monster_list_f)
    CONTRO
    nome1 nome2 nome1 nome2 ( di _monster_list_pc)
  • Re: Segmentation fault

    In questo caso qualcosa non è andata per il verso giusto quando hai aggiunto i nomi nelle liste
  • Re: Segmentation fault

    oregon ha scritto:


    In questo caso qualcosa non è andata per il verso giusto quando hai aggiunto i nomi nelle liste

    Lo so ma non capisco dov'è l'errore
  • Re: Segmentation fault

    Tanto meno lo sappiamo noi ...

    1) esegui il codice in debugging mode e controlla l'esecuzione della parte dell'inserimento passo passo ...

    2) isola la parte dell'inserimento e mostracela ...
  • Re: Segmentation fault

    oregon ha scritto:


    Tanto meno lo sappiamo noi ...

    1) esegui il codice in debugging mode e controlla l'esecuzione della parte dell'inserimento passo passo ...

    2) isola la parte dell'inserimento e mostracela ...

    Ho capito l'errore, grazie lo stesso
Devi accedere o registrarti per scrivere nel forum
16 risposte