Ошибка сегментации (ядро сброшено) Ошибка - PullRequest
2 голосов
/ 06 декабря 2010

Моя программа компилирует штрафы, но при вводе файла я получаю сообщение об ошибке «Ошибка сегментации (ядро сброшено)».Я правильно не обращаюсь с ostream?

#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";
}

Ответы [ 4 ]

4 голосов
/ 06 декабря 2010
scale == 'c' || 'C'

не делает то, что вы думаете, что делает.Он разбирается так:

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

и 'C' всегда верно.Если бы у вас были включены предупреждения компилятора, вы должны были заметить это.

(Нет, это не ваша непосредственная проблема; она возникает в конце get_temps. Но с включенными предупреждениями вы бы тоже это увидели.)

0 голосов
/ 06 декабря 2010

Что делает error? Если оно не выдает исключение, то вызывающий его код будет продолжать работать с поддельными данными.

cin >> name; читает только слово из стандартного ввода, а не всю строку. Поэтому, если в имени файла есть пробелы, ваша программа не получит правильное имя файла.

0 голосов
/ 06 декабря 2010

Вы компилируете на машине с Linux? Если это так, Valgrind является отличным инструментом для диагностики ошибок сегментации.

0 голосов
/ 06 декабря 2010

Присоедините отладчик и пошагово пройдитесь по коду. Возможно, вы делите на 0 или пробегаете через конец массива. По крайней мере, нам нужно больше информации, прежде чем мы сможем помочь.

...