在某些运行中出现Seg错误,而在其他运行中没有(使用相同的输入文件)
Seg-fault on some runs and not on others (with the same input file)
我是一名CS学生,正在上c++课程。我有一个奇怪的错误,程序有时会在同一个输入上运行seg错误(有时不会)。我对可能发生的事情感到非常困惑。有人有什么想法吗?我的帖子是按以下顺序排列的:我的代码、输入文件、输出(使用相同输入的3个不同输出)。
#include <iostream>
#include <fstream>
#include <string>
struct Class {
std::string name;
double totalWork;
double totalLearned;
bool hasVisited;
Class* neighbors;
Class* previousClass;
};
void searchClassOne(int indexCurrent, int indexNeighbor, int numClasses, double maxWork,
double& maxLearning, Class* classes)
{
if(indexCurrent == numClasses - 1) return;
if(indexNeighbor == numClasses - 2) {
indexNeighbor = 0;
indexCurrent++;
}
int totalWork = classes[indexCurrent].totalWork +
classes[indexCurrent].neighbors[indexNeighbor].totalWork;
int totalLearning = classes[indexCurrent].totalLearned +
classes[indexCurrent].neighbors[indexNeighbor].totalLearned;
if(totalLearning > maxLearning && totalWork < maxWork) maxLearning = totalLearning;
indexNeighbor++;
searchClassOne(indexCurrent, indexNeighbor, numClasses, maxWork, maxLearning, classes);
return;
}
int main(int argc, char* argv[])
{
std::string fileName = argv[1];
std::ifstream ifile(fileName);
int numClasses = 0, maxWork = 0;
ifile >> numClasses >> maxWork;
std::string dummy;
getline(ifile, dummy);
Class* classes = new Class[numClasses];
for(int index = 0; index < numClasses; index++) {
classes[index].neighbors = new Class[numClasses - 1];
}
for(int index = 0; index < numClasses; index++) {
classes[index].name = "";
classes[index].totalWork = 0.0;
classes[index].totalLearned = 0.0;
classes[index].hasVisited = false;
}
int classNum = 0;
std::cout << "CHECK 1" << std::endl;
while(classNum < numClasses) {
ifile >> classes[classNum].name;
ifile >> classes[classNum].totalWork;
ifile >> classes[classNum].totalLearned;
std::string dummyTwo;
getline(ifile, dummyTwo);
classNum++;
}
std::cout << "CHECK 2" << std::endl;
for(int i = 0; i < numClasses; i++) {
std::cout << "CHECK 3 + " << i << std::endl;
for(int j = 0; j < numClasses; j++) {
std::cout << "CHECK 4 + " << j << std::endl;
if(classes[i].name != classes[j].name)
classes[i].neighbors[j] = classes[j];
}
}
std::cout << "CHECK 5" << std::endl;
double maxLearning = 0;
searchClassOne(0, 0, numClasses, maxWork, maxLearning, classes);
std::cout << "Maximum learning: " << maxLearning << std::endl;
delete [] classes;
classes = NULL;
return 0;
}
输入文件读取:
4 3.14159
CSCI104 3.001 10.0
CSCI170 2.41 8.0
ENGR102 0.10 0.36
CSCI280 0.66 2.15
输出读取(多次):
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 2
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 3
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 5
Maximum learning: 8
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
Segmentation fault: 11
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 2
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 3
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 5
Maximum learning: 8
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
Segmentation fault: 11
再看一下这一行:
classes[i].neighbors[j] = classes[j];
j
的最大值是多少?neighbors
的大小是多少?
编辑:这就是我所说的额外索引变量:
for(int i = 0; i < numClasses; i++) {
std::cout << "CHECK 3 + " << i << std::endl;
int neighborIndex = 0;
for(int j = 0; j < numClasses; j++) {
std::cout << "CHECK 4 + " << j << std::endl;
if(classes[i].name != classes[j].name) {
classes[i].neighbors[neighborIndex] = classes[j];
neighborIndex++;
}
}
}
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 读取文件时运行时的未知行为
- 如何在.obj文件上运行IlDasm?
- 编译多个C++文件.调用二进制文件以运行代码
- 如何在Google Cloud Functions上运行C++文件?
- 无法在 VS Code 上使用代码运行程序运行C++文件
- 如何在不受其他文件影响的情况下"by itself" Visual Studio 项目中运行C++文件?
- 以目录作为参数运行C 文件?而是使用bash
- 如何在制作后运行.o文件
- 如何在 OpenBR 中运行C++文件
- 包含库的c++运行文件失败而没有编译错误(CMake / CLion)
- 在尝试运行文件时,yaml-cpp出错
- 编译并运行文件夹中提供的MySQL++和C++示例
- 如何在不使用cygwin的情况下在Windows (Vista)中运行c++文件的makefile
- 运行c++文件,输入Sublime Text 2
- 如何在windows7的turbo c中运行c++文件
- 运行文件直到*字符串*,然后读取列直到*没有十进制*
- 从命令行运行 c++ 文件
- 不能在VS Code 2015中调试或运行文件