CodeBlocks代码在Visual Studio中不起作用

时间:2015-02-05 05:04:03

标签: c++ visual-studio codeblocks

我的代码只是计算学生的最终成绩。当我在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个文件,其中包含计算中位数和最终成绩的函数(随着帖子越来越长,将它们保留下来)。< / p>

我认为问题不在于代码本身(因为它在CodeBlocks上运行良好),而是与不同编译器的兼容性。我还没有找到一个令人满意的答案,并且很乐意得到关于可能导致错误的内容的输入(visual studio构建它没有错误,但在显示最终成绩时失败)。谢谢。

编辑:以下是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

1 个答案:

答案 0 :(得分:1)

我错误地写了我的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!