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

    [C++] Segment fault durante la creazione di un'istanza

    Salve a tutti.
    Come da titolo, quando vado a creare un'istanza di una classe ottengo un segment fault e non ne sto riuscendo a venire a capo.
    Vi allego il sorgente dei .cpp nella speranza che possiate farmi capire dove e cosa sto sbagliando.
    Vi avviso che sono un novizio in C++, infatti lo trovo molto diverso da Java... Già il fatto di dover avere un costruttore, eventualmente vuoto, per passare gli oggetti mi infastidisce xD
    Ecco i sorgenti:
    codice:
    /* 
     * File:   main.cpp
     * Author: Amministratore
     *
     * Created on 30 ottobre 2012, 22.58
     */
    
    #include <iostream>
    #include "Persona.h"
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    /*
     * 
     */
    int main() {
        string nome, cognome, dataStr;
        int data[3], i=0;
        
        cout << "Inserisci il nome: ";
        cin >> nome;
        cout << "Inserisci il cognome: ";
        cin >> cognome;
        cout << "Inserisci la data di nascita (gg/mm/aaaa): ";
        cin >> dataStr; 
        istringstream stream(dataStr);
        while(!stream.eof()){
            string app;
            getline(stream, app, '/');
            data[i++]=atoi(app.c_str());
        }
        Data d(data[0], data[1], data[2]);
        Persona p(nome, cognome, d);
        cout << endl << "Nome: " << p.getNome() << endl << "Cognome: " << p.getCognome() << endl;
        cout << "Data di nascita: " << d.getGiorno() << "/" << d.getMese() << "/" << d.getAnno() << endl;
        cout << "Età: " << p.calcolaEta() << " anni." << endl;
        return EXIT_SUCCESS;
    }
    codice:
    /* 
     * File:   Persona.cpp
     * Author: Amministratore
     * 
     * Created on 30 ottobre 2012, 22.18
     */
    
    #include "Persona.h"
    #include <ctime>
    void Persona::ridimensionaStringa(string& var, string ass){
        if(ass.size()>MAX_LENGTH){
            ass.resize(MAX_LENGTH);
            var=ass;
        }else{
            var=ass;
        }
    }
    Persona::Persona(string n, string c, Data dn){
        ridimensionaStringa(nome, n);
        ridimensionaStringa(cognome, c);
        dataNascita=dn;
    }
    Persona::~Persona(){
        delete this;
    }
    string Persona::getNome() const{
        return nome;
    }
    string Persona::getCognome() const{
        return cognome;
    }
    Data Persona::getDataNascita() const{
        return dataNascita;
    }
    void Persona::setNome(string nn){
        nome=nn;
    }
    void Persona::setCognome(string nc){
        cognome=nc;
    }
    void Persona::setDataNascita(Data ndn){
        dataNascita=ndn;
    }
    int Persona::calcolaEta() const{
        time_t tempoCorrente;
        tm *dataNascitaConv=new tm();
        time(&tempoCorrente);
        dataNascitaConv->tm_mday=dataNascita.getGiorno();
        dataNascitaConv->tm_mon=dataNascita.getMese()-1;
        dataNascitaConv->tm_year=dataNascita.getAnno()-1900;
        float differenza=difftime(tempoCorrente, mktime(dataNascitaConv));
        return (int)differenza/(60*60*24*365);
    }
    codice:
    /* 
     * File:   Data.cpp
     * Author: Amministratore
     * 
     * Created on 30 ottobre 2012, 21.51
     */
    
    #include "Data.h"
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    bool Data::checkAnno(int a) const{
        return a>=ANNO_MIN && a<=ANNO_MAX;
    }
    bool Data::checkGiorno(int g) const{
        return g>=GIORNO_MESE_MIN && g<=GIORNO_MAX;
    }
    bool Data::checkMese(int m) const{
        return m>=GIORNO_MESE_MIN && m<=MESE_MAX;
    }
    Data::Data(int g, int m, int a){
        if(checkGiorno(g) && checkMese(m) && checkAnno(a)){
            giorno=g;
            mese=m;
            anno=a;
        }else{
            cerr << "Data non valida!" << endl << "Il programma verrà terminato!";
            exit(EXIT_FAILURE);
        }
    }
    Data::Data(){}
    Data::~Data(){
        delete this;
    }
    int Data::getGiorno() const{
        return giorno;
    }
    int Data::getMese() const{
        return mese;
    }
    int Data::getAnno() const{
        return anno;
    }
    void Data::setGiorno(int ng){
        if(checkGiorno(ng)){
            giorno=ng;
        }else{
            cerr << "Giorno non valido!" << endl << "Il giorno non è stato modificato!" << endl;
        }
    }
    void Data::setMese(int nm){
        if(checkMese(nm)){
            mese=nm;
        }else{
            cerr << "Mese non valido!" << endl << "Il mese non è stato modificato!" << endl;
        }
    }
    void Data::setAnno(int na){
        if(checkAnno(na)){
            anno=na;
        }else{
            cerr << "Anno non valido!" << endl << "L'anno non è stato modificato!" << endl;
        }
    }
    Vi ringrazio ^_^
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma ti succede per la classe Data o per la Persona?

    E i file .h ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Mi succede nel main quando vado ad instanziare l'oggetto p di classe persona.

    Se servono anche i .h ve li posto senza problemi; pensavo fossero superflui.

    codice:
    /* 
     * File:   Data.h
     * Author: Amministratore
     *
     * Created on 30 ottobre 2012, 21.51
     */
    
    #ifndef DATA_H
    #define	DATA_H
    
    const int GIORNO_MESE_MIN=1, MESE_MAX=12, GIORNO_MAX=31, ANNO_MIN=1900, ANNO_MAX=2030;
    
    class Data {
    public:
        Data(int g, int m, int a);
        Data();
        virtual ~Data();
        int getGiorno() const;
        int getMese() const;
        int getAnno() const;
        void setGiorno(int ng);
        void setMese(int nm);
        void setAnno(int na);    
    private:
        int giorno, mese, anno;
        bool checkGiorno(int g) const;
        bool checkMese(int m) const;
        bool checkAnno(int a) const;
    };
    
    #endif	/* DATA_H */
    codice:
    /* 
     * File:   Persona.h
     * Author: Amministratore
     *
     * Created on 30 ottobre 2012, 22.18
     */
    
    #ifndef PERSONA_H
    #define	PERSONA_H
    
    #include <string>
    #include "Data.h"
    using namespace std;
    
    const int MAX_LENGTH=25;
    
    class Persona {
    public:
        Persona(string n, string c, Data dn);
        virtual ~Persona();
        string getNome() const;
        string getCognome() const;
        Data getDataNascita() const;
        void setNome(string nn);
        void setCognome(string nc);
        void setDataNascita(Data ndn);
        int calcolaEta() const;
    private:
        void ridimensionaStringa(string& var, string ass);
        string nome, cognome;
        Data dataNascita;
    };
    
    #endif	/* PERSONA_H */
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Elimina quei

    delete this;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ti ringrazio; così funziona :-)
    mi potresti spiegare il perchè del verificarsi di questo problema? inoltre come posso deallocare la memoria occupata dalla mia istanza?
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  6. #6
    Il distruttore viene richiamato quando la classe viene distrutta, se scrivi delete this nel distruttore fai un errore, perché:
    - se questa istanza è stata allocata sullo stack (o come campo all'interno di un'altra struttura/classe), stai chiamando delete su una cosa che non è stata allocata con new;
    - se questa istanza è stata allocata con new, tenti di deallocare due volte la stessa cosa.

    Ricorda: nel distruttore ti occupi di operazioni di cleanup relative alla tua classe e ai suoi membri, ma non di deallocare la memoria occupata dall'istanza corrente "in sé" - quella è un'operazione che viene effettuata automaticamente nel momento in cui un oggetto viene distrutto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7

    Re: [C++] Segment fault durante la creazione di un'istanza

    Originariamente inviato da Naruto 92
    Già il fatto di dover avere un costruttore, eventualmente vuoto, per passare gli oggetti mi infastidisce xD
    Ma non è mica necessario, se la tua classe non gestisce direttamente risorse va bene il costruttore di copie di default... e comunque in Java non sono necessari i costruttori di copie perché si passa tutto per riferimento, cosa che puoi tranquillamente fare anche in C++.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8

    Re: Re: [C++] Segment fault durante la creazione di un'istanza

    Originariamente inviato da MItaly
    Ma non è mica necessario, se la tua classe non gestisce direttamente risorse va bene il costruttore di copie di default... e comunque in Java non sono necessari i costruttori di copie perché si passa tutto per riferimento, cosa che puoi tranquillamente fare anche in C++.
    Si ma io quel costruttore l'avevo eliminato essendo abituato a Java che lo inserisce il compilatore di default. Inoltre in Java non bisogna gestirli direttamente i puntatori... ma vabe, lasciamo stare :-)
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

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 © 2025 vBulletin Solutions, Inc. All rights reserved.