Я новичок в этом форуме, но я мог бы действительно помочь.
Мне было поручено программировать игру жизни Конвея на C ++ и компилировать в Cygwin (с помощью make-файла). Я не прошу никого закончить программу для меня или что-то в этом роде, но я полностью застрял в этой части …
Одним из аспектов программы является предоставление пользователю возможности вводить текстовый файл в качестве карты для начальной сетки, а не использовать случайно сгенерированную сетку.
Вот пример формата файла .txt (цифры и ‘X’ приведены, например, просто, файл может быть любым вариантом этого формата):
5 (rows)
6 (columns)
-----X
X--X--
------
-XX---
------
«X» обозначает пространства с живыми бактериями, а «-» обозначает мертвые пространства.
Хотя моя программа прекрасно компилируется через cygwin, когда я запускаю .exe, я получаю ошибку «Ошибка сегментации (Core Dumped)». Я проделал обширный поиск в Google до этого момента, но обнаружил, что эта ошибка, как правило, очень специфична для той программы, к которой она относится, поэтому другие решения мне не сильно помогают.
Я не хочу спамить вас, ребята, тонной кода, поэтому я пока включаю только функцию 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.
Любая помощь или совет будет принята с благодарностью.
Спасибо!!!
Использовать 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).
Если ваш первоначальный интерес заключается только в том, чтобы выяснить, в чем заключается проблема в вашем коде, вам не обязательно нужен отладчик; Я никогда не использовал его, и обычно мне удается выявлять ошибки в моих программах. Вы можете установить флаги и использовать операторы 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);
}