У меня есть код, который просто вычисляет окончательный класс студентов. Когда я запускаю его в 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.cpp
grade.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
Какое значение вы видите, если вы перейдете к отладчику? – ben
VS делает намного больше проверок, чем советы, чтобы помочь вам найти неприятные ошибки. Каково определение класса()? – Christophe
Да, вы должны пройти через функцию grade() и убедиться, что вектор домашней работы индексируется правильно. – ben