我是新来的,我不确定这是否适合发布,但我有点紧张......
我正在参加一个C ++入门课程并且有一个我很好的作业,并且我一直收到这个我无法解决的错误。我问我的补充教练和其他学生,他们认为这是一个失控的指针。我想我已经将问题隔离到一些代码但行为很奇怪。赋值调用使用student类读取两个文件并输出。现在我正在尝试解决这个错误,特别是因为它明天到期(已经工作了2周)。代码在这里:
https://github.com/MetroMayhem/Project1
当我发表评论时,我没有收到错误:
istream & operator>>(istream & in, Student & s)
{
in >> s.SID;
in >> s.firstName;
in >> s.lastName;
in >> s.courseCount;
//"""this part: v"""
//for (int i = 0; i < s.courseCount; i++)
// in >> s.courses[i];
return in;
}
但是当我不评论它并且只在我的主要创建一个学生对象时,将信息读入其中并输出它,它就可以了。但是当我尝试循环读取它时,我得到一些疯狂的wacko错误,打开'xutility'文件并说我正在访问无效的内存。
这在我的main()中不起作用:
while (studentInput.good()) {
studentInput >> students[studentIndex++];
}
但这有效:
studentInput >> students[0];
studentOutput << students[0];
我只是各种各样的困惑,任何提示都会很好。
编辑:很抱歉提出这个问题,因为它太模糊了。我将继续尝试修复它并让你知道我是否发现了什么错误。
Edit2:感谢您提供的意见,我可以通过您的提示让我的所有错误消失并让我的程序运行。
答案 0 :(得分:0)
可能您忘了为s.courses
分配内存:
s.courses.resize(s.courseCount);
此外,您可能忘记将内存分配给students
。您应该执行以下任一操作:
students.resize(numberOfStudents); // it should not be more than numberOfStudents students
while (studentInput.good()) {
studentInput >> students[studentIndex++];
}
或:
while (studentInput.good()) {
studentInput >> student;
students.push_back(student);
}
或:
while (studentInput.good()) {
students.resize(studentIndex);
studentInput >> students[studentIndex++];
}
答案 1 :(得分:0)
在operator>>()
内,您的代码会修改s.courses[i]
。您未提供有关courses
的内容的信息。
大概是 - 尽管你没有这么说 - 指针,数组或std::vector<Something>
。在所有这些情况下,大小必须不小于s.courseCount
,但您的代码无法确保这一点。如果大小不够,代码将显示未定义的行为(一个常见但不保证的症状是程序崩溃)。
同样,循环
while (studentInput.good()) {
studentInput >> students[studentIndex++];
}
需要确保students
包含所需数量的元素。否则结果也是未定义的行为。
要意识到的是,数组和标准容器(如std::vector
)在访问元素时不会神奇地调整自己的大小(例如studentInput >> students[studentIndex++]
并不能神奇地确保students
包含的元素超过studentIndex
个元素。)
您实际上没有指定Student::courses
(courses
类型中名为Student
的成员)是什么,或者students
是什么(在后面的代码中)std::vector
。所以不可能就如何调整它们提供建议。它们是什么(例如数组,指针,function getShortest(arr) {
return arr.reduce(function(acc, value) {
if (typeof value == 'string') {
if (acc === null || value.length < acc.length) {
acc = value;
}
}
return acc;
}, null) || '';
}
var test0 = [ 4, 'two','one', 2, 'three']; // Has strings
var test1 = [ 4, {},[], 2, new Date()]; // No strings
var test2 = []; // Empty
var test3 = [ 4, 'two','', 2, 'three']; // Has strings, shortest empty
console.log('test0: "' + getShortest(test0) + '"'); // "two"
console.log('test1: "' + getShortest(test1) + '"'); // no strings
console.log('test2: "' + getShortest(test2) + '"'); // empty
console.log('test3: "' + getShortest(test3) + '"'); // ""
)将决定它们的大小(或者甚至是否)。
答案 2 :(得分:0)
错误发生在你的resizeArray中。只要studentIndex&lt; ARRAY_SIZE。
如果resizeArray不是必需的,我会亲自废弃它并直接获取文件大小,然后创建一个这个大小的学生数组。我这样做是为了让它完全发挥作用:
//move file cursor to end
studentInput.seekg(0, studentInput.end);
//get file length
int ARRAY_SIZE = studentInput.tellg();
//return cursor to beginning of file
studentInput.seekg(0, studentInput.beg);
int studentIndex = 0;
Student *students = new Student[ARRAY_SIZE];
//short circuit array size, and keep reading until EOF/bad
while ((studentIndex < ARRAY_SIZE) && (studentInput >> students[studentIndex++])) {
}