2015-02-05 2 views
0

У меня есть код, который просто вычисляет окончательный класс студентов. Когда я запускаю его в CodeBlocks, у меня нет проблем. Однако, когда я скопировал его в Visual Studio (хотел попробовать IDE), я получаю ошибку vector subscript out of range.Код CodeBlocks не работает в Visual Studio

в main.cpp:

#include <iostream> 
#include <vector> 
#include <stdexcept> 
#include "info.h" 
#include "grade.h" 

int main() 
{ 
    std::cout << "enter name and grades" << std::endl; 
    std::vector<info> students; 
    info record; 
    while (read(std::cin, record)) 
    { 
     students.push_back(record); 
    } 

    for (std::vector<info>::size_type i = 0; i < students.size(); i++) 
    { 
     std::cout << students[i].name << " "; 
     try 
     { 
      double finalgrade = grade(students[i]); // ERROR 
      std::cout << finalgrade; 
     } 
     catch (std::domain_error e) 
     { 
      std::cout << e.what(); 
     } 
     std::cout << std::endl; 
    } 
    return 0; 
} 

В info.h:

#ifndef GUARD_info 
#define GUARD_info 

#include <string> 
#include <vector> 


struct info 
{ 
    std::string name; 
    double midterm, final; 
    std::vector<double> homework; 
}; 

std::istream& read_hw(std::istream&, std::vector<double>&); 
std::istream& read(std::istream&, info&); 

#endif 

В info.cpp:

#include <iostream> 
#include <vector> 
#include "info.h" 

std::istream& read_hw(std::istream& in, std::vector<double>& hw) 
{ 
    if (in) 
    { 
     hw.clear(); 
     double x; 
     while (in >> x) 
     { 
      hw.push_back(x); 
     } 
     in.clear(); 
    } 
    return in; 
} 

std::istream& read(std::istream& in, info& stu) 
{ 
    in >> stu.name >> stu.midterm >> stu.final; 
    read_hw(in, stu.homework); 
    return in; 
} 

У меня есть median.cpp, median.h, grade.cppgrade.h и файлы, которые содержат функции, вычисляющие средний и конечный оценки (сохранение их в виде сообщения становится длинным).

Я думаю, что проблема заключается не в самом коде (поскольку он отлично работает на CodeBlocks), а в его совместимости с различными компиляторами. Я еще не нашел удовлетворительного ответа и был бы рад получить информацию о том, что может вызвать ошибку (визуальная студия строит ее без ошибок, но не работает при отображении окончательных оценок). Спасибо.

EDIT: вот grade.cpp, grade.h, median.cpp и median.h файлы:

grade.cpp В:

#include <vector> 
#include <stdexcept> 
#include "median.h" 
#include "info.h" 

double grade(double midterm, double final, double hw) 
{ 
    return 0.2*midterm + 0.4*final + 0.4*hw; 
} 

double grade(double midterm, double final, const std::vector<double>& hw) 
{ 
    if (hw.size() == 0) 
     throw std::domain_error("Student has done no homework."); 
    return grade(midterm, final, median(hw)); 
} 

double grade(const info& stu) 
{ 
    return grade(stu.midterm, stu.final, stu.homework); 
} 

grade.h В:

#ifndef GRADE_H_INCLUDED 
#define GRADE_H_INCLUDED 

#include <vector> 
#include "info.h" 
#include <stdexcept> 

double grade(double, double, double); 
double grade(double, double, const std::vector<double>&); 
double grade(const info&); 

#endif 

В median.cpp:

#include <vector> 
#include <stdexcept> 

double median(std::vector<double> vec) 
{ 
    if (vec.size() == 0) 
     throw std::domain_error("Median of an empty vector."); 

    typedef std::vector<double>::size_type vec_sz; 
    vec_sz size = vec.size(); 
    vec_sz mid = size/2; 

    return size % 2 ? (vec[mid] + vec[mid - 1])/2 : vec[mid]; 
} 

В median.h:

#ifndef GUARD_median_h 
#define GUARD_median_h 

#include <vector> 

double median(std::vector<double>); 

#endif 
+1

Какое значение вы видите, если вы перейдете к отладчику? – ben

+0

VS делает намного больше проверок, чем советы, чтобы помочь вам найти неприятные ошибки. Каково определение класса()? – Christophe

+1

Да, вы должны пройти через функцию grade() и убедиться, что вектор домашней работы индексируется правильно. – ben

ответ

1

я ошибочно написал в своей медианы функция

return size % 2 ? (vec[mid] + vec[mid - 1])/2 : vec[mid]; 

(), когда я должен был бы написать

return size % 2 == 0 ? (vec[mid] + vec[mid - 1])/2 : vec[mid]; 

спасибо Марку!

Смежные вопросы