Compilerfehler--Thema--Konstruktoren und Klassen!!!



  • Hi,

    ich versucher seit einigen Minuten zu verstehen, warum ich mein Quellcode nicht richtig zum laufen bekomme.

    Dieser Teil in meinem Quellcode wird ausgeführt:

    getWinner(dat);
    Customer susollp(poluzi, jojo, holla, Like);
    susollp.toString();

    Der Rest leider nicht. Der Compiler zeigt mir immer segmentation fault und dazu gibt es dann Programm finisher with exit Code 139. Es scheint irgendwie ein Problem mit dem Zwischenspeichern zu geben?

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    string Like = "------";//Global Def.
    
    class Customer{
    public:
    
    int number, postCode;
    string name,a,domiciler;
    
    Customer(int m, string b, int c, string d){
    a = " ";
    number = m; 
    name = b; 
    postCode = c; 
    domiciler = d; 
    
    }
    
    Customer(){
        
     a = " ";
    number = 17762225;
     name = "Chloe";
     postCode = 39100;
    domiciler = "Mannheim, Schöndorfstraße. 13";
    
    }
    
    
    
    
    
    
    void read();
    
    string toString(); 
    
    
    
    
    string Ausgabe(){
    
    return to_string(number) + a + name + a + to_string(postCode)+ a + domiciler;
    
    }
    };
    
    void Customer::read(){
    
    cout<<"Name?"<<endl;
        getline(cin, name);
       cout<<name<<endl;
       
    cout<<"Ort, Staße und Hausnummer?"<<endl;
         getline(cin, domiciler);
    cout<<domiciler<<endl;  
    
    cout<<"Telefonnumer?"<<endl;
         cin>>number;
        cout<<number<<endl;
    
    cout<<"PLZ?"<<endl;
        cin>>postCode;
        cout<<postCode<<endl;
    
    }
    
       string Customer::toString() 
        {
         cout<<endl<< "____________ Person___________" << endl
    		  << name << endl
    		  << postCode << endl
    		  << domiciler << endl 	
    		  << number << endl
    		  << "______________________________" << endl; 
         
        }
        
        
    void getWinner(string dat[5]){
    
        srand(time(0)); 
        int g, z;
        
      do{
      
         g = rand() % 5;
         
              cout<<g<<endl;
             
              if (g!=0){
              
        for (z=g; z<g+1; z++)
        {
                 Like = dat[z];
        }        
              }    
    }while(g==0);
    }
    
       
    
    
    int main(){
        
     
    
        
        
    int Golusa = 12223679; 
    string Heinma = "Olivia";
    int pusel = 66767;
    string inmol = "Reichheim, Turmstraße.12";
    
    int poluzi = 100;
    string jojo = "Er/Sie hat sich durchgesetzt";
    int holla= 100;
    string c[5]={"-----------------------","----------------------","------------------------","---------------------","--------------------"};
    
     string dat[5] =
     {"Anna, 1777878, 64292 Hochausen, Holzstraße. 14", 
     "Sabrina, 662782, 66645 Dorfheim, Holmstarße. 12",
     "Kathi, 66790890, 55656 Hausenheim, Ghorstraße. 12", 
     "xzian, 667754, 88980 Turmhaus, Rassenstraße. 12", 
     "Emma, 567567, 55677 Dachhausen, Klorusstraße. 12"}; 
    
    
    
    
    Customer suso(Golusa,Heinma,pusel,inmol);
    suso.read();
    suso.toString();
    
    
    
    
    Customer susi;
    cout<<susi.Ausgabe()<<endl;
    susi.toString();
    
    
    
    
    
    getWinner(dat);
    Customer Tommy(poluzi,jojo,holla,Like);
    Tommy.toString();
    
    
    
    
    
    
    
    
    
    
    
    
      return 0;  
    }
    
    


  • @Sahra127 sagte in Compilerfehler--Thema--Konstruktoren und Klassen!!!:

      string Customer::toString() 
        {
         cout<<endl<< "____________ Person___________" << endl
    		  << name << endl
    		  << postCode << endl
    		  << domiciler << endl 	
    		  << number << endl
    		  << "______________________________" << endl; 
         
        }
    

    Die Funktion behauptet einen std::string zurückzugeben, gibt aber nixe zurück. Mit den üblichen Compiler-Einstellungen sollte das schonmal gar nicht kompilieren. Und selbst wenn solltest du eine Warngung beim Kompilieren bekommen.



    1. Segmentation fault ist keine Meldung des Compilers, sondern des Betriebssystems. Dein Programm greift auf Speicher zu, der ihm nicht zugewiesen wurde. Das bedeutet normalerweise, dass du mit Arrays und Zeigern etwas falsch machst, z.B. uninitialisierte Zeiger benutzt, über Arraygrenzen hinaus schreibst oder dergleichen.
    2. Schalte die Warnungen bei deinem Compiler ein. Falls du das schon getan hast, beachte sie. (Dann würdest du wissen, dass in deiner Funktion Customer::toString die return-Anweisung fehlt.)
    3. getWinner ist mir zu kompliziert um es auf einen Blick zu erfassen. Das kann auch falsch sein. (Korrigiere: auf einen zweiten Blick verstehe ich es, und es ist in der Tat relativ unsinnig, führt aber ziemlich sicher nicht zum Absturz.)


  • @hustbaer Super, danke.



  • ps: Falls du GCC verwendest: -Wall -Wextra evtl. noch zusätzlich -Wpedantic.
    Falls du MSVC verwendest: /W3 oder gleich /W4.


Log in to reply