我是这个论坛的新手,但我真的可以使用一些帮助。 我的任务是用C ++编写Conway的生命游戏,并在Cygwin中编译(使用makefile)。我不是要求任何人为我或类似的事情完成该计划,但我完全被这一部分困住了...... 该程序的一个方面是允许用户输入文本文件作为初始网格的地图,而不是使用随机生成的网格。 下面是.txt文件格式的示例(数字和'X'纯粹是例如,文件可以是此格式的任何变体):
5 (rows)
6 (columns)
-----X
X--X--
------
-XX---
------
'X'代表有活细菌的空间,' - '代表死亡空间。 虽然我的程序通过cygwin编译得很好,但是当我运行.exe时出现“分段错误(Core Dumped)”错误。我已经做了大量的谷歌搜索到这一点,但我发现这个错误通常非常特定于它关注的程序,所以其他解决方案对我没有多大帮助。 我不想用大量代码向你们发送垃圾邮件,所以我现在只包括我的loadFile函数。如果您需要更多代码来帮助,请告诉我,我会立即发布。 这是我在loadFile函数中到目前为止的内容:
void GamePlay::loadFile(int r, int c, char** newBoard){
int i;
//int r;
//int c;
//char** newBoard;
int len;
int k;
do{
r = 0;
c = 0;
string filePath;
cout << "Please enter a file path" << endl;
cin >> filePath;
DIR* path = opendir(filePath.c_str());
string fpath = filePath.c_str();
dirent* openIn = readdir(path);
string line;
string ext = ".txt";
i = 0;
while(openIn && i != -1){
if(openIn->d_type == DT_REG){
string fileName = openIn->d_name;
string filePath = fpath + fileName;
int begExt = fileName.find_last_of(".");
int endExt = fileName.find_last_of("t");
string extension = fileName.substr(begExt, endExt);
ifstream in(filePath.c_str());
k = 0;
if(in && ext == extension){
getline(in,line);
istringstream(line) >> r;
getline(in,line);
istringstream(line) >> c;
newBoard = new char*[r]; //create multi-d array
for(int a = 0; a < r; ++a){
newBoard[a] = new char[c];
}
while(in.good() && i != -1){
if(k <= r){
if(len == c){
for(int g = 0; g < r; ++g){
getline(in,line);
len = line.size();
char* arr = new char[len];
memcpy(arr,line.c_str(),len);
for(int h = 0; h < c; ++h){
newBoard[g][h] = arr[h];
}
}
}
/*if(len == c){
//newBoard = len*sizeof(char*);
for(int a = 0; a < len; ++a){
newBoard[a] = r;
memcpy(newBoard[a], line, r);
}
}*/
else{
cout << "Your column number does not match your grid." << endl;
cout << "Please try again with a new file." << endl;
i = -1;
}
}
else{
cout << "Your row number does not match your grid." << endl;
cout << "Please try again with a new file." << endl;
i = -1;
}
k++;
}
}
else{
cout << "File invalid. Please try again with a new file." << endl;
i = -1;
}
return;
}
else{
cout << "Invalid file path. Please try again with a new file." << endl;
i = -1;
}
}
}while(i = -1);
}
我也尝试使用GDB进行调试并找到问题所在,但这已经超出了我的想象。可悲的是,我以前习惯使用的是GUI,例如visual studio和eclipse。 任何帮助或建议将不胜感激。 感谢!!!
答案 0 :(得分:0)
使用GDB非常简单,只需
gdb [path-to-your-executable]
run
[wait for it to crash]
backtrace
这将告诉你崩溃发生在哪里。您还可以使用
插入断点break file:line
当它停止时,使用
print [some expression]
要查找有关当前堆栈帧(变量及其所有)的信息,请“继续”继续下一个断点。如有必要,您还可以使用
远程调试gdb [path-to-your-executable] [process ID]
如果你的程序向终端屏幕输出大量信息,这是好事(因为否则会弄乱GDB的输出)。
答案 1 :(得分:0)
如果您最初的兴趣只是找到代码中的问题,那么您不一定需要调试器;我从未使用过一个,并且通常设法从我的程序中获取错误。您可以设置标志并使用cout语句来识别程序出现问题的位置。当我在高中和大学里使用C ++时,我做了很多。
我在下面的代码中输入了一些cout语句,这样你就知道我在说什么了。你还没试过这个,对吗?显然,您运行程序并查看生成的标志输出。如果一个出现而后一个出现,那么你已经缩小了哪一行代码搞乱了你的程序。
void GamePlay::loadFile(int r, int c, char** newBoard){
int i;
//int r;
//int c;
//char** newBoard;
int len;
int k;
cout << "flag1";
do{
r = 0;
c = 0;
string filePath;
cout << "Please enter a file path" << endl;
cin >> filePath;
cout << "flag2";
DIR* path = opendir(filePath.c_str());
string fpath = filePath.c_str();
dirent* openIn = readdir(path);
string line;
string ext = ".txt";
i = 0;
cout << "flag3";
while(openIn && i != -1){
if(openIn->d_type == DT_REG){
string fileName = openIn->d_name;
string filePath = fpath + fileName;
int begExt = fileName.find_last_of(".");
int endExt = fileName.find_last_of("t");
string extension = fileName.substr(begExt, endExt);
cout << "flag4";
ifstream in(filePath.c_str());
k = 0;
if(in && ext == extension){
getline(in,line);
istringstream(line) >> r;
getline(in,line);
istringstream(line) >> c;
newBoard = new char*[r]; //create multi-d array
for(int a = 0; a < r; ++a){
newBoard[a] = new char[c];
}
cout << "flag5";
while(in.good() && i != -1){
if(k <= r){
if(len == c){
for(int g = 0; g < r; ++g){
getline(in,line);
len = line.size();
char* arr = new char[len];
memcpy(arr,line.c_str(),len);
for(int h = 0; h < c; ++h){
newBoard[g][h] = arr[h];
}
}
}
/*if(len == c){
//newBoard = len*sizeof(char*);
for(int a = 0; a < len; ++a){
newBoard[a] = r;
memcpy(newBoard[a], line, r);
}
}*/
else{
cout << "Your column number does not match your grid." << endl;
cout << "Please try again with a new file." << endl;
i = -1;
}
}
else{
cout << "Your row number does not match your grid." << endl;
cout << "Please try again with a new file." << endl;
i = -1;
}
k++;
}
}
else{
cout << "File invalid. Please try again with a new file." << endl;
i = -1;
}
return;
}
else{
cout << "Invalid file path. Please try again with a new file." << endl;
i = -1;
}
}
cout << "flag6";
}while(i = -1);
}