Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - errore di segmentazione
Forum - C/C++ - errore di segmentazione

Avatar
frankus89 (Normal User)
Rookie


Messaggi: 23
Iscritto: 20/02/2009

Segnala al moderatore
Postato alle 20:05
Lunedì, 29/06/2009
salve ragazzi!
ricevo un errore di segmentazione, che non riesco a spiegarmi proprio..
il programma è il seguente e mi viene compilato correttamente e senza alcun warning:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7.  
  8. class CasaEditrice{
  9.       char* nominativo;
  10.       int telefono;
  11.       int fax;
  12.       int iva;
  13.       int codice;
  14.       char* indirizzo;
  15.       public:
  16.              CasaEditrice(){
  17.                                  nominativo=NULL;
  18.                                  telefono=0;
  19.                                  fax=0;
  20.                                  iva=0;
  21.                                  codice=0;
  22.                                  indirizzo=NULL;
  23.                                 };
  24.                                
  25.              CasaEditrice(char* a, int b, int c, int d, int e, char* f){ nominativo = new char [strlen(a)+1];
  26.                                                                             if(!nominativo){ cout<<"Errore!";
  27.                                                                                       exit(1);
  28.                                                                                       };
  29.                                                                             strcpy(nominativo,a);
  30.                                                                            
  31.                                                                             telefono = b;
  32.                                                                             fax = c;
  33.                                                                             iva = d;
  34.                                                                             codice = e;
  35.                                                                            
  36.                                                                             indirizzo = new char [strlen(f)+1];
  37.                                                                             if(!indirizzo){ cout<<"Errore!";
  38.                                                                                       exit(1);
  39.                                                                                       };
  40.                                                                             strcpy(indirizzo,f);
  41.                                                                             return;
  42.                                                                             };
  43.              
  44.                                
  45.              CasaEditrice(const CasaEditrice &obj) { nominativo= new char[strlen(obj.nominativo)+1];
  46.                                                       if(!nominativo){ cout<<"Errore!";
  47.                                                                 exit(1);
  48.                                                                 };
  49.                                                       strcpy(nominativo, obj.nominativo);
  50.                                                      
  51.                                                       telefono=obj.telefono;
  52.                                                       fax = obj.fax;
  53.                                                       iva = obj.iva;
  54.                                                       codice = obj.codice;
  55.                                                      
  56.                                                       indirizzo = new char[strlen(obj.indirizzo) + 1];
  57.                                                       if(!indirizzo) { cout<<"Errore!";
  58.                                                                  exit(1);
  59.                                                                  };
  60.                                                       strcpy(indirizzo, obj.indirizzo);
  61.                                                       return;
  62.                                                       };
  63.                                                      
  64.              friend ostream& operator << (ostream& stream, CasaEditrice obj);
  65.              friend istream& operator >> (istream& stream, CasaEditrice &obj);
  66.              };
  67.  
  68. class Volume: public CasaEditrice{
  69.       char* titolo;
  70.           char* w1;
  71.           char* w2;
  72.           char* w3;
  73.       float prezzo;
  74.       public:
  75.              int ISBN;
  76.                          Volume():CasaEditrice(){
  77.                                  titolo=NULL;
  78.                                  w1=NULL;
  79.                                  w2=NULL;
  80.                                  w3=NULL;
  81.                                  prezzo=0;
  82.                          };
  83.              Volume(char* a, int b, int c, int d, int e, char* f,char* g, char* h, char* i, char* l, float m, int n) : CasaEditrice(a,b,c,d,e,f){
  84.                                                                          
  85.                                                                          titolo = new char[strlen(g)+1];
  86.                                                                          if(!titolo){ cout<<"Errore!";
  87.                                                                                    exit(1);
  88.                                                                                    };
  89.                                                                          strcpy(titolo,g);
  90.                                                                          
  91.                                                                          w1 = new char[strlen(h) + 1];
  92.                                                                          if(!w1) { cout<<"Errore!";
  93.                                                                                     exit(1);
  94.                                                                                     };
  95.                                                                          strcpy(w1,h);
  96.                                                                          
  97.                                                                          w2= new char[strlen(i) + 1];
  98.                                                                          if(!w2) { cout<<"Errore!";
  99.                                                                                     exit(1);
  100.                                                                                     };
  101.                                                                          strcpy(w2,i);
  102.                                                                          
  103.                                                                          w3 = new char[strlen(l) + 1];
  104.                                                                          if(!w3) { cout<<"Errore!";
  105.                                                                                     exit(1);
  106.                                                                                     };
  107.                                                                          strcpy(w3,l);
  108.                                                                          
  109.                                                                          prezzo = m;
  110.                                                                          ISBN = n;
  111.                                                                          return;
  112.                                        
  113.                                                                          };
  114.              
  115.              
  116.              Volume(const CasaEditrice obj,const Volume& ob): CasaEditrice(obj){
  117.                                      titolo = new char[strlen(ob.titolo)+1];
  118.                                      if(!titolo){ cout<<"Errore di allocazione nel titolo";
  119.                                                exit(1);
  120.                                                };
  121.                                      strcpy(titolo,ob.titolo);
  122.                                      
  123.                                      w1=new char[sizeof(ob.w1)+1];
  124.                                                                          if(!w1){ cout<<"Errore!";
  125.                                                                                                 exit(1);
  126.                                                                                         }
  127.                                                                          strcpy(w1,ob.w1);
  128.                                                                          
  129.                                                                          w2=new char[sizeof(ob.w2)+1];
  130.                                                                          if(!w2){ cout<<"Errore!";
  131.                                                                                                 exit(1);
  132.                                                                                         }
  133.                                                                          strcpy(w2,ob.w2);
  134.                                                                          
  135.                                                                      w3=new char[sizeof(ob.w3)+1];
  136.                                                                          if(!w3){ cout<<"Errore!";
  137.                                                                                                 exit(1);
  138.                                                                                         }
  139.                                                                           strcpy(w3,ob.w3);
  140.                                                                          
  141.                                                                           prezzo = ob.prezzo;                                  
  142.                                       ISBN = ob.ISBN;
  143.                                       return;
  144.                                       };                                  
  145.            
  146.              friend ostream& operator<<(ostream& stream, Volume obj);
  147.              friend istream& operator>>(istream& stream, Volume &obj);
  148.              
  149.              };
  150.              
  151.  
  152.      
  153. ostream& operator<<(ostream& stream, CasaEditrice obj)
  154. {
  155.          stream<<"CASA EDITRICE: "<<'\n';
  156.          
  157.          stream<<"Nominativo: "<<obj.nominativo<<'\n';
  158.          stream<<"Numero di Telefono: "<<obj.telefono<<'\n';
  159.          stream<<"FAX: "<<obj.fax<<'\n';
  160.          stream<<"Partita IVA: "<<obj.iva<<'\n';
  161.          stream<<"Codice: "<<obj.codice<<'\n';
  162.          stream<<"Indirizzo: "<<obj.indirizzo<<'\n';
  163.          
  164.          return stream;
  165.          };
  166.  
  167. istream& operator>>(istream& stream, CasaEditrice& obj)
  168. {
  169.          cout<<"Inserire casa editrice: "<<'\n';
  170.          
  171.          cout<<"Inserire nominativo: ";
  172.          stream>>obj.nominativo;
  173.          cout<<"Inserire numero di Telefono: ";
  174.          stream>>obj.telefono;
  175.          cout<<"Inserire FAX: ";
  176.          stream>>obj.fax;
  177.          cout<<"Inserire Partita IVA: ";
  178.          stream>>obj.iva;
  179.          cout<<"Inserire codice: ";
  180.          stream>>obj.codice;
  181.          cout<<"Inserire indirizzo: ";
  182.          stream>>obj.indirizzo;
  183.          
  184.          return stream;
  185. };
  186.  
  187. ostream& operator<<(ostream& stream, Volume obj)
  188. {
  189.          CasaEditrice* pointer;
  190.          pointer = &obj;
  191.          
  192.                  stream<<(*pointer)<<'\n';
  193.          stream<<"Volume "<<'\n';
  194.          stream<<"Titolo: "<<obj.titolo<<'\n';
  195.          stream<<"Parola chiave 1: "<<obj.w1<<'\n';
  196.          stream<<"Parola chiave 2: "<<obj.w2<<'\n';
  197.          stream<<"Parola chiave 3: "<<obj.w3<<'\n';
  198.          stream<<"Prezzo: "<<obj.prezzo<<'\n';
  199.          stream<<"Codice ISBN: "<<obj.ISBN<<'\n';
  200.          
  201.          return stream;
  202. };
  203.  
  204. istream& operator>>(istream& stream, Volume& obj)
  205. {
  206.          CasaEditrice* pointer;
  207.          pointer=&obj;
  208.          
  209.          stream>>(*pointer);
  210.          cout<<"Inserire Volume: "<<'\n';
  211.          cout<<"Inserire titolo: ";
  212.          stream>>obj.titolo;
  213.          cout<<"Inserire parola chiave 1: ";
  214.          stream>>obj.w1;
  215.          cout<<"Inserire parola chiave 2: ";
  216.          stream>>obj.w2;
  217.          cout<<"Inserire parola chiave 3: ";
  218.          stream>>obj.w3;
  219.          cout<<"Inserire prezzo: ";
  220.          stream>>obj.prezzo;
  221.          cout<<"Inserire codice ISBN: ";
  222.          stream>>obj.ISBN;
  223.          
  224.          return stream;
  225. };
  226.  
  227. struct VolumeConQuantitaeDisposizione{  
  228.        Volume* vol;
  229.        int quantita;
  230.        int coll;
  231.        };
  232.                    
  233.  
  234. template <int Q> class Biblioteca{
  235.           VolumeConQuantitaeDisposizione ob[Q];
  236.           public:
  237.                  Biblioteca() {
  238.                               for(int i=0;i<Q;i++) ob[i].quantita = 0;
  239.                               }  
  240.                  Biblioteca& operator+ (VolumeConQuantitaeDisposizione& obj){
  241.                                                                       int i=0;
  242.                                                                       int adv=0;
  243.                                                                       while(i<Q){
  244.                                                                                       if(obj.vol->ISBN == ob[i].vol->ISBN){
  245.                                                                                       ob[i].quantita ++;
  246.                                                                                       adv=1;
  247.                                                                                        };
  248.                                                                          };
  249.                                                                       if(adv){
  250.                                                                          return *this;
  251.                                                                          };
  252.                                                                       i=0;
  253.                                                                       while(i<Q && ob[i].quantita!=0) {i++;};
  254.                                                                       if (i>=Q){
  255.                                                                             cout<<"\nImpossibile allocare libri in bibloteca!";
  256.                                                                             return *this;
  257.                                                                                 }
  258.                                                                       else{
  259.                                                                            ob[i].vol=obj.vol;
  260.                                                                            ob[i].quantita=obj.quantita;
  261.                                                                            ob[i].coll=obj.coll;
  262.                                                                                };
  263.                                                                            return *this;
  264.                                                                               };      
  265.                    
  266.                    
  267.                    
  268.                    
  269.                     Biblioteca& prestito(int num, int cod){
  270.                                       int i;
  271.                                       for(i=0;i<Q;i++)
  272.                                       {
  273.                                       if (cod== ob[i].vol.ISBN){
  274.                                         if(ob[i].quantita >=num){
  275.                                                           ob[i].quantita=ob[i].quantita - num;
  276.                                                           if(ob[i].quantita==0){
  277.                                                                                 cout<< "Volumi di questo tipo ESAURITI";
  278.                                                                                 };
  279.                                                           return *this;
  280.                                                           };
  281.                                          if(ob[i].quantita <num){
  282.                                                   cout<<"Numero libri non disponibili.";
  283.                                                   return *this;
  284.                                                   };
  285.                                                   };
  286.                                      cout<<"\nVolume non presente in biblioteca" ;
  287.                                      return *this;                                    
  288.                                     };                                              
  289.                                     };                
  290.                  
  291.                  
  292. };
  293.  
  294. istream& operator>>(istream& stream, VolumeConQuantitaeDisposizione& obj)
  295. {
  296.          cout<<"Inserisci Volume con quantita' e disposizione: ";
  297.          stream>>*(obj.vol);
  298.          cout<<"Inserisci quantita: "<<'\n';
  299.          stream>>obj.quantita;
  300.          cout<<"Inserisci collocazione: "<<'\n';
  301.          stream>>obj.coll;
  302.          
  303.          return stream;
  304.          };
  305. ostream& operator<< (ostream& stream, VolumeConQuantitaeDisposizione obj){
  306.         cout<<"Volume: \n";
  307.         stream<<*(obj.vol);
  308.         cout<<"\n";
  309.         cout<<"Quantita: \n";
  310.     stream<<obj.quantita;
  311.         cout<<"Collocazione: \n";
  312.         stream<<obj.coll;
  313.        
  314.         return stream;
  315. };
  316.  
  317. int main()
  318. {
  319.  
  320.    ofstream out("Registro_biblioteca");
  321.    
  322.    Biblioteca <10> Bib;
  323.    
  324.    Volume ob1,ob2;
  325.  
  326. cin >> ob1;
  327. cin>>ob2;
  328.    cout<<ob1;
  329.    cout<<ob2;
  330.    out<<ob1;
  331.    out<<ob2;
  332.    
  333.    _sleep(5000);
  334.    
  335.    VolumeConQuantitaeDisposizione x;
  336.  
  337.    cin>>x;
  338.    cout<<x;
  339.    system("pause");
  340.    _sleep(5000);
  341.    
  342.    Biblioteca<10> bib;
  343.    bib = Bib + x;
  344.    out.close();
  345.    
  346.    return 0;
  347.    
  348. };



come risolvo il problemA??
perchè il programma mi si blocca sulla prima istruzione??

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 23:24
Lunedì, 29/06/2009
Il costruttore richiamato in

Volume ob1,ob2;
  
non alloca lo spazio per le stringhe che usi nel codice dell'operatore >> richiamato in

cin >> ob1;

da cui l'errore.

PM Quote
Avatar
frankus89 (Normal User)
Rookie


Messaggi: 23
Iscritto: 20/02/2009

Segnala al moderatore
Postato alle 22:09
Martedì, 30/06/2009
Capisco l'errore.
ma come posso fare se voglio che un oggetto non sia inizializzato nel main, ma "modificato" da tastiera??
se passassi stringhe nel main, chiamerei il costruttore parametrizzato. ma nel momento in cui chiamo l'operatore >> i nuovi dati non occupano una posizione diversa dai precedenti, che occuperanno spazio in memoria inutile??

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 22:18
Martedì, 30/06/2009
Esegui una if nell'operatore >> per controllare se il puntatore e' NULL. Solo in questo caso allochi la memoria prima di utilizzarla.

PM Quote