2010-12-06 8 views
2

Mein Programm kompiliert Feinheiten, aber beim Eingeben einer Datei erhalte ich einen Fehler "Segmentation fault (core dumped)". Passe ich die Ostream nicht richtig an?Segmentierungsfehler (Core Dumped) Fehler

#include <std_lib_facilities.h> 

struct Reading { 
    int hour; 
    double temperature; 
    Reading(int h, double t): hour(h), temperature(t) { } 
    bool operator<(const Reading &r) const; 
}; 

bool Reading::operator<(const Reading &r) const 
{ 
// stub version                       

    if (temperature < r.temperature){ 

     return true; 

} 
    else if (r.temperature < temperature) { 

     return false; 
    } 


} 

/*                          
* function declarations                     
*/ 

ostream& operator<<(ostream& ost, const Reading &r); 

vector<Reading> get_temps(); 

double check_adjust_temp(double temperature, char scale); 

double c_to_f(double temperature); 

double mean(vector<Reading> temps); 

double median(vector<Reading> temps); 

void print_results(const vector<Reading>& temps, double mean_temp, 
        double median_temp); 

int main() 
    try 
     { 
      vector<Reading> temps = get_temps(); 
      if (temps.size() == 0) error("no temperatures given!"); 
      double mean_temp = mean(temps); 
      sort(temps.begin(), temps.end()); 
      double median_temp = median(temps); 
      print_results(temps, mean_temp, median_temp); 
     } 
    catch (exception& e) { 
     cerr << "error: " << e.what() << '\n'; 
     return 1; 
    } 
    catch (...) { 
     cerr << "Oops: unknown exception!\n"; 
     return 2; 
    } 

/*                          
* function definitions                     
*/ 

ostream& operator<<(ostream& ost, const Reading &r) 
{ 

    return ost << '(' << r.hour 
       << ',' << r.temperature <<')'; 
} 

vector<Reading> get_temps() 
{ 
    cout << "Please enter name of input file name: "; 
    string name;; 
    cin >> name; 
    ifstream ist(name.c_str()); 
    if(!ist) error("can't open input file ", name); 

    vector<Reading> temps; 
    int hour; 
    double temperature; 
    while (ist >> hour >> temperature){ 
     if (hour <0 || 23 <hour) error("hour out of range"); 
     temps.push_back(Reading(hour,temperature)); 
    } 

} 

double check_adjust_temp(double temperature, char scale) 
{ 
    if (scale == 'c' || 'C'){ 

     return c_to_f(temperature); 
    } 
    else if (scale == 'f' || 'F') { 

     return temperature; 
    } 
    else { 

     error("Wrong input type"); 
    } 
} 

double c_to_f(double temperature) 
{ 
    double c; 
    c = ((temperature * (9.0/5)) + 32); 
    return (c); 
} 

double mean(vector<Reading> temps) 
{ 
    double mean_temp; 
    double sum = 0; 
    for (int i = 0; i< temps.size(); ++i) sum += temps[i].temperature; 
    mean_temp = sum/temps.size(); 
    return (mean_temp); 
} 

double median(vector<Reading> temps) 
{ 
    double median_temp; 
    sort (temps.begin(), temps.end()); 
    median_temp = temps[temps.size()/2].temperature; 
    return (median_temp); 
} 

void print_results(const vector<Reading>& temps, double mean_temp, 
        double median_temp) 
{ 

    cout << "The sorted temperatures are:\n"; 
    cout << get_temps; 
    cout << "The mean temperature is " << mean_temp << ".\n"; 
    cout << "The median temperature is " << median_temp << ".\n"; 
} 

Antwort

4
scale == 'c' || 'C' 

macht nicht das, was Sie denken, es tut. Es analysiert wie folgt aus:

(scale == 'c') || 'C' 

und 'C' immer wahr ist. Wenn Sie Compiler-Warnungen aktiviert haben, sollten Sie dies bemerkt haben.

(Nein, das ist nicht Ihre unmittelbare Problem, es liegt am Ende der get_temps aber mit Warnungen aktiviert ist, würden Sie das auch gesehen haben..)

+0

Tut mir leid, dass mein Compiler nichts fängt, ich kann Warnungen nicht richtig erhalten. Können Sie das Problem am Ende von get_temps näher erläutern? Vielen Dank. – John

+0

Alle nicht-void-Funktionen müssen einen Rückgabewert haben. (Okay, es gibt Ausnahmen zu dieser Regel, aber sie gelten hier nicht.) – ephemient

+0

@John: Das Gleiche mit 'Reading :: operator <'; Wenn die Temperaturen gleich sind, gibt es keinen Rückgabewert. Der Körper dieser Funktion sollte ein Einzeiler sein: "Rücklauftemperatur Praetorian

0

einen Debugger anhängen und den Code Schritt für Schritt durch. Es ist möglich, dass Sie durch 0 teilen oder über das Ende eines Arrays hinauslaufen. Zumindest brauchen wir mehr Informationen, bevor wir helfen können.

0

Kompilieren Sie auf einem Linux-Rechner? Wenn dies der Fall ist, ist Valgrind ein großartiges Werkzeug für die Diagnose von Segmentierungsfehlerfehlern.

0

Was macht error? Wenn es keine Ausnahme auslöst, wird Code, der es aufruft, mit gefälschten Daten weitermachen.

cin >> name; liest nur ein "Wort" von der Standardeingabe, nicht eine ganze Zeile. Wenn der Dateiname Leerzeichen enthält, erhält Ihr Programm nicht den korrekten Dateinamen.

Verwandte Themen