Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] Segmentation fault (core dumped)

    Salve a tutti. Ho cercato nel forum possibili soluzioni per il mio problema ma non ne sono ancora venuto a capo, per cui chiedo il vostro aiuto.

    Questi sono i file che ho creato:

    codice:
    //File distributore.h
    
    #ifndef DISTRIBUTORE_H
    #define DISTRIBUTORE_H
    
    #include <string>
    #include <vector>
    #include <cassert>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    class Film
    {
    friend ostream& operator<<(ostream& os, const Film& f);
    public:
    	Film(string t, string r, unsigned a);
    	string Titolo() const {return titolo;}
    	string Regista() const {return regista;}
    	unsigned Anno() const {return anno;}
    	
    	Film* TrovaOriginale() const {return originale;}
    	void AggiornaCatalogo(unsigned c) {catalogo.first += c; catalogo.second += c;}
    	void UscitaFilm() {catalogo.second--;}
    	void RitornaFilm() {catalogo.second++;}
    	void FissaOriginale(Film* f);
    	
    	bool operator==(const Film& f) const {return titolo == f.titolo && regista == f.regista;}
    	pair<unsigned, unsigned> CopieFilm() const {return catalogo;}
    private:
    	string titolo, regista;
    	unsigned anno;
    	Film* originale;
    	bool remake;
    	pair<unsigned,unsigned> catalogo; //catalogo.first = copie_totali, catalogo.second = copie_presenti
    };
    
    class Distributore
    {
    friend ostream& operator<<(ostream& os, const Distributore& d);
    public:
    	Distributore(string n) {nome = n;}
    	string Nome() const {return nome;}
    	
    	Film* VediFilm(unsigned i) const {return films[i];}
    	int NumFilm() const {return films.size();}
    	void InserisciFilm(Film* f, unsigned c);
    	void EliminaFilm(Film* f);
    	void EsceFilm(Film* f);
    	void RitornaFilm(Film* f);
    	
    	pair<unsigned, unsigned> CopieFilm(Film* f);
    	vector<Film*> ListaFilmPerAnno(unsigned a);
    	vector<Film*> ListaRemake();
    private:
    	string nome;
    	vector<Film*> films;
    	int TrovaFilm(Film*);
    };
    
    #endif
    codice:
    //File distributore.cpp
    
    #include "distributore.h"
    
    Film::Film(string t, string r, unsigned a) : titolo(t)
    {
    	regista = r;
    	anno = a;
    }
    
    void Film::FissaOriginale(Film* f)
    {
    	(*this).remake = true;
    	(*this).originale = f;
    	(*f).remake = false;
    }
    
    int Distributore::TrovaFilm(Film* f)
    {
    	for (unsigned i = 0; i < films.size(); i++)
    		if (films[i] == f)
    			return i;
    	return -1;
    }
    
    void Distributore::InserisciFilm(Film* f, unsigned c)
    {
    	int indice = TrovaFilm(f);
    	if (indice != -1)
    		f -> AggiornaCatalogo(c);
    	else
    	{
    		films.push_back(f);
    		f -> AggiornaCatalogo(c);
    	}
    }
    
    pair<unsigned,unsigned> Distributore::CopieFilm(Film* f)			// da rivedere!!!
    {
    	pair <unsigned,unsigned> copie_film = (f -> CopieFilm());
    
    	return copie_film;
    }
    
    void Distributore::EliminaFilm(Film* f)
    {
    	int indice = TrovaFilm(f);
    	pair <unsigned,unsigned> copie = (CopieFilm(f));
    	
    	assert (indice != -1);
    	assert (copie.first == copie.second);
    	
    	films.erase(films.begin() + indice);
    }
    
    void Distributore::EsceFilm(Film* f)
    {
    	assert (TrovaFilm(f) != -1);
    	pair <unsigned,unsigned> copie_film = (CopieFilm(f));
    	assert (copie_film.second > 0);
    	
    	f -> UscitaFilm();
    }
    
    void Distributore::RitornaFilm(Film* f)
    {
    	assert (TrovaFilm(f) != -1);
    	pair <unsigned,unsigned> copie_film = (CopieFilm(f));
    	assert (copie_film.second < copie_film.first);
    	
    	f -> RitornaFilm();
    }
    
    ostream& operator<<(ostream& os, const Film& f)
    {
    	os << "Il film " << f.titolo << " del regista " << f.regista << endl;
    	
    	if (f.remake)
    		os << " e' un remake del film " << f.originale -> Titolo() << " del regista " << f.originale -> Regista() << ".\n" << endl;
    	else
    		os << " e' un film originale.\n" << endl;
    	
    	os << "Di questo film ci sono " << f.catalogo.first << " copie, di cui " << f.catalogo.second << " attualmente presenti.\n\n" << endl;
    	
    	return os;
    }
    
    ostream& operator<<(ostream& os, const Distributore& d)
    {
    	os << "In questo distributore sono presenti i seguenti film: \n\n" << endl;
    	
     	for (unsigned i = 0; i < d.films.size(); i++)
    		os << *(d.films[i]);
    	
    	return os;
    }
    codice:
    #include "distributore.h"
    
    int main()
    {
    	Distributore d1("Chivideo");
    	
    	Film f1("Alice in wonderland","R. Polanski",1997), f2("F Punto","F. Miccoli",2002), f3("La donna dei vampiri","M. Rossi",2006),
    			 f4("Chatroulette","G. Yespica",2008) , f5("Il frate","G. Abacuz",2003), f6("Gigi la trottola","G. Gialli",1999),
    			f7("30 Giorni","L. Verdi",2001);
    	
    	f7.FissaOriginale(&f1);
    	f3.FissaOriginale(&f2);
    	
    	d1.InserisciFilm(&f1, 20);
    	d1.InserisciFilm(&f2, 30);
    	d1.InserisciFilm(&f3, 15);
     	d1.InserisciFilm(&f4, 25); 
    	d1.InserisciFilm(&f5, 8);
    	d1.InserisciFilm(&f6, 10);
    	d1.InserisciFilm(&f7, 14);
    	
    	cout << d1;
    		
    	return 0;
    }
    Ho compilato i programmi usando Cygwin e inizia stampando correttamente i primi 3 film inseriti ed al quarto film dopo aver stampato il titolo ed il regista mi dà l'errore:

    Segmentation fault (core dumped)

    Da quello che ho capito girando nel forum dovrebbe essere un problema di indirizzamento, ma la mia scarsa esperienza non mi permette di identificare il problema e tantomeno di risolverlo.

    Ogni aiuto sarà ben apprezzato!!!

    Grazie in anticipo.

  2. #2
    Il costruttore di Film va fatto così:

    Codice PHP:
    Film::Film(string tstring runsigned a) : titolo(t)
    {
        
    regista r;
        
    anno a;
        
    remake false//<- nota

    come avevi fatto tu, remake non viene settato mai, a meno che non chiami fissafilm. Se un film non è un remake, remake può avere un valore indefinito, quindi anche positivo. Se è positivo, f.remake (o f->remake ovviamente), risulta vero, quindi, nell'overload di <<, ti va a stampare i dati del film originale, che non ci sono.

    Risolvi dicendo che il film non è un remake, a meno che non si specifica altrimenti (ovvero chiamando FissaFilm)


  3. #3
    Grazie, questo particolare mi era sfuggito. Nel frattempo avevo risolto il problema in questo modo ed il programma funzionava:

    codice:
    #include "distributore.h"
    
    int main()
    {
    	Distributore d1("Chivideo");
    	
    	Film* f1 = new Film("Alice in wonderland","R. Polanski",1997);
    	Film* f2 = new Film("F Punto","F. Miccoli",2002);
    	Film* f3 = new Film("La donna dei vampiri","M. Rossi",2006);
    	Film* f4 = new Film("Chatroulette","G. Yespica",2008);
    	Film* f5 = new Film("Il frate","G. Abacuz",2003);
    	Film* f6 = new Film("Gigi la trottola","G. Gialli",1999);
    	Film* f7 = new Film("30 Giorni","L. Verdi",2001);
    	
    	f7 -> FissaOriginale(f1);
    	f3 -> FissaOriginale(f2);
    	
    	d1.InserisciFilm(f1, 20);
    	d1.InserisciFilm(f2, 30);
    	d1.InserisciFilm(f3, 15);
     	d1.InserisciFilm(f4, 25); 
    	d1.InserisciFilm(f5, 8);
    	d1.InserisciFilm(f6, 10);
    	d1.InserisciFilm(f7, 14);
    	
    	d1.EsceFilm(f3);
    	d1.EsceFilm(f3);
    	d1.EsceFilm(f3);
    	d1.EsceFilm(f3);
    	
    	
    	cout << d1;
    		
    	return 0;
    }
    La persona che mi ha seuggerito questo cambiamento mi ha detto che il problema stava nell'allocazione di memoria degli oggetti film che andavo a creare, in quanto senza il comando "new" andava ad allocare lo spazio nella parte sbagliata della memoria. Senza il comando new veniva occupata una parte di memoria che poteva essere successivamente utilizzata per altre operazioni che avrebbero sovrascritto lo spazio dedicato ai film. Invece, utilizzando il comando new gli oggetti film vengono creati in una parte di memoria che non rischia di essere sovrascritta da successive operazioni.

    Se aveste ulteriori chiarimenti al riguardo ve ne sarei molto grato. E grazie per l'aiuto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.