Так что здесь идет еще один школьный вопрос. Это мой код для решения лабиринтов, довольно стандартный, основанный на глубинном поиске. Код, кажется, работает хорошо, но когда я достигаю конца лабиринта, я получаю ошибку сегментации. Я действительно изо всех сил пытаюсь узнать, откуда это исходит.
Так вот фактический код, который решает 5×5 3D лабиринт
bool PathFinder :: findPath(int x, int y, int z)
{
cout << "*****findpath called"<< endl;
find_x = x;
find_y = y;
find_z = z;
string insert_x, insert_y, insert_z;
ostringstream stream_x, stream_y , stream_z;
stream_x << find_x;
stream_y << find_y;
stream_z << find_z;
insert_x = stream_x.str();
insert_y = stream_y.str();
insert_z = stream_z.str();
cout << "working on" << insert_x << " " << insert_y << " " << insert_z << endl;
cout << "checking to see if its in bounds" << endl;
if (find_x < 0 || find_y < 0 || find_z < 0 || find_x > 4 || find_y > 4 || find_z > 4)
{
// then out of bounds!
cout << "out of bounds" << endl;
return false;
}else
cout << "checking if end" << endl;
if (find_x == 4 && find_y == 4 && find_z == 4 && (Maze[find_x][find_y][find_z].cube_value == 1))
{
// then i finished successfully!
cout << "is finish" << endl;
return true;
}
else
cout << "checking for wall" << endl;
if (Maze[find_x][find_y][find_z].cube_value != 1 && Maze[find_x][find_y][find_z].visited != true)
{
// then it is a wall
cout << "is a wall" << endl;
Maze[find_x][find_y][find_z].visited = true;
return false;
}else
cout << "checking if visited" << endl;
if (Maze[find_x][find_y][find_z].visited == true)
{
// then it I have been here
cout << "I have been here" << endl;
Maze[find_x][find_y][find_z].visited = true;
return false;
}
else
{
cout << "operating on valid cube" << endl;
string to_push = "(" + insert_x + ", " + insert_y + ", " + insert_z + ")";
cout << " pushing" << to_push << endl;
pathstack.push(to_push);
Maze[find_x][find_y][find_z].visited = true;
if(findPath(find_x,find_y,find_z + 1) && Maze[find_x][find_y][find_z + 1].visited != true)
{
return true;
}
else if(findPath(find_x,find_y,find_z-1) && Maze[find_x][find_y][find_z-1].visited != true)
{
return true;
}
else if(findPath(find_x,find_y + 1,find_z) && Maze[find_x][find_y+1][find_z].visited != true)
{
return true;
}
else if(findPath(find_x,find_y-1,find_z) && Maze[find_x][find_y-1][find_z].visited != true)
{
return true;
}
else if(findPath(find_x+1,find_y,find_z) && Maze[find_x+1][find_y][find_z].visited != true)
{
return true;
}
else if(findPath(find_x-1,find_y,find_z) && Maze[find_x-1][find_y] [find_z].visited != true)
{
return true;
}
else
{
cout << "removing ------------->" << pathstack.top() << endl;
pathstack.pop();
return false;
}
}
}
У меня есть много вызовов, поскольку я пытался отладить этот код, следующая функция — это функция, которая фактически вызывает вышеуказанную функцию, и в случае успеха создает массив с координатами решения.
vector<string> PathFinder :: mazeSolCoordinates()
{
// set up local variables
cout << "LAB MAZE SOLVER" << endl;
vector<string> returnpath;
pathstack.empty();
temporary.empty();
if(findPath(0,0,0) == true)
{
cout << "starting to convert to string vector" << endl;
pathstack.push("(4, 4, 4)");
int size = pathstack.size();
for(int count = 0 ; count < size ; count++)
{
// cout << "reversal" << endl;
// cout << pathstack.top() << endl;
temporary.push(pathstack.top());
pathstack.pop();
}
for(int count = 0 ; count < size ; count++)
{
// cout << "adding to vector" << endl;
// cout << temporary.top() << endl;
returnpath.resize(count+1);
returnpath[count] = temporary.top();
// cout << "just added to string vector" << endl;
temporary.pop();
// cout << "just popped this baby of the stack" << endl;
}
find_x = 0;
find_y = 0;
find_z = 0;
return returnpath;
}else
{
cout << "no vector to return" << endl;
return returnpath;
}
}
Я вполне уверен, что эта вторая часть работает нормально, и моя ошибка происходит, прежде чем я доберусь до линии
соиЬ << «начать преобразовывать в строковый вектор» << епсИ;
Так что я довольно растерялся относительно того, откуда исходит ошибка сегментации. Любой вклад или идеи были бы замечательными!
Спасибо!
Вывод на консоль в самом конце (я избавляю вас от всего этого, но только для того, чтобы показать, что он работает до конца, достигает базового сценария и вызывает ошибки, почему !!!?
pushing(3, 4, 4)
*****findpath called
working on3 4 5
checking to see if its in bounds
out of bounds
*****findpath called
working on3 4 4
checking to see if its in bounds
checking if end
checking for wall
checking if visited
I have been here
*****findpath called
working on3 5 4
checking to see if its in bounds
out of bounds
*****findpath called
working on3 4 4
checking to see if its in bounds
checking if end
checking for wall
checking if visited
I have been here
*****findpath called
working on4 4 4
checking to see if its in bounds
checking if end
is finish
Run_Test_Driver.sh: line 14: 27431 Segmentation fault (core dumped) ./$EXE
Press any key to exit...
Обновление, так что я запускаю это через XCode с точками останова, прямо когда / после выполнения «return true»; я получаю следующую ошибку:
_LIBCPP_ASSERT (__ п < size (), «индекс вектора [] вне границ»);
Я не супер склонен к отладке с помощью этого инструмента или вообще, где в моем коде будет пытаться прочитать вектор после этого шага?
Обновление здесь мой main.cpp
#include <iostream>
#include "PathFinder.h"using namespace std;
int main ()
{
cout << "Hello World!";
PathFinder* me;
me = new PathFinder();
me->importMaze("Solvable1.txt");
me->getMaze();
me->solveMaze();me->createRandomMaze();
me->getMaze();
me->solveMaze();me->createRandomMaze();
me->getMaze();
me->solveMaze();me->createRandomMaze();
me->getMaze();
me->solveMaze();
return 0;
}
Как вы можете видеть, findPath вызывается из mazeSolCoordinates в операторе if.
Задача ещё не решена.
Других решений пока нет …