CodeBlocks代码在Visual Studio中不起作用

CodeBlocks code not working in Visual Studio

本文关键字:不起作用 Studio Visual 代码 CodeBlocks      更新时间:2023-10-16

我有一些代码可以简单地计算学生的最终成绩。当我在CodeBlocks中运行它时,我没有问题。然而,当我在Visual Studio中复制它(想尝试IDE)时,我得到了错误vector subscript out of range

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.cppmedian.hgrade.cppgrade.h文件,其中包含计算中位成绩和期末成绩的函数(由于职位越来越长,所以将它们排除在外)。

我认为问题不在于代码本身(因为它在CodeBlocks上运行良好),而在于它与不同编译器的兼容性。我还没有找到一个令人满意的答案,我很高兴能得到关于可能导致错误的原因的信息(visualstudio构建它没有错误,但在显示最终成绩时失败了)。非常感谢。

EDIT:这里是grade.cppgrade.hmedian.cppmedian.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

我在median()函数中错误地写入

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

我应该在什么时候写

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

谢谢MarkU!