2012-05-19 4 views
0

У меня есть эта функция для решения лабиринта на C++, но когда я запускаю программу, я получаю ошибку «Бад-доступ» в рекурсии. Я думаю, что это может быть бесконечный цикл. Я понятия не имею, где и что происходит не так.Застрял в бесконечной рекурсии

bool Solve_Maze(int coorx,int coory) { 
    if((Map[coorx][coory]==Start)||(Map[coorx][coory]==path)) { 
     Map[coorx][coory]=wall; 
     Solve_Maze(coorx+1,coory); 
     Solve_Maze(coorx-1,coory); 
     Solve_Maze(coorx,coory+1); 
     Solve_Maze(coorx,coory-1); 
    }else if(Map[coorx][coory]==End) { 
     cout<<"You Solved the Maze!"<<endl; 
     delete Map; 
     return(true); 
    } 
} 
+0

В зависимости от карты, но вы, вероятно, следует проверить, если coorx и coory являются действительными координатами/значения для карты –

+0

Они, я показал координаты перед тем, если заявление и все работало, как ожидалось (первый набор COOR был Start и каждый другой coor был дорогой). –

+1

Я не вижу, где вы отмечаете место, которое было отправлено. На первый взгляд кажется, что вы можете очень легко идти туда и обратно и никогда не кончать. (Я думаю, вы бы взорвали свой стек.) – Marvo

ответ

0

Запустите его в отладчике (gdb или dbx). Скомпилируйте с флагом -g, чтобы ваша программа была отлажена. Если вы не знаете, как использовать отладчик, google «dbx cheatsheet». Вы можете изолировать, где он застрял в цикле (если ваша догадка правильная) и шаг за шагом. Общее время, в течение которого вам потребуется достаточно знаний в отладчике, чтобы это сделать, и на самом деле это меньше времени, которое вы уже потратили на размышления об этом.

Никаких сарказмов не существует - люди действительно часто переоценивают работу по изучению отладчика, поэтому я хочу действительно утверждать, что он стоит того, даже для простой проблемы, и чрезвычайно окупается для больших проблем.

+0

Когда я запускаю программу, она останавливается на " EXC_BAD_ACCESS "в инструкции if. Когда я его отлаживаю, он продолжает работать через рекурсию, пока я снова не получу ошибку. –

+1

@JakeRunzer Это не рекурсия, это проблема, вы не проверяете, не являются ли кооркс и кооры действителен, и вы получаете доступ к памяти, которой у вас нет разрешения на чтение. Aka, а не память, принадлежащая вашей программе. Также может быть, что вы удаляете карту на другие три итерации функции после ее решения, но до e буфера, который вы не видите. – gcochard

+0

Да, неудача в том, что «если» означает, что один из ваших кооркс или коры выходит за пределы вашего массива. Итак, выясните, что делать, когда это происходит, и код для него. – djechlin

2

1) Вы не возвращаете значения в случае если оператор
2) Карта [coorx] [coory] всегда назначается на стену во всех вызовах функций .. Стоит ли стена ссылаться на глобальное состояние?

+0

В классе есть 4 частных символа, Начало, Конец, стена и путь. Все они действительны, и программа успешно находит начальные координаты. –

2

Я изменил функцию, чтобы вернуть пустоту, так как значение не было возвращено в стек. В этом случае вы просто используете глобальную переменную , чтобы проверить, был ли найден конец. (это потребует от вас установить «found = false» каждый раз перед запуском функции).

bool found = false; 

Вы также хотите, чтобы сделать некоторые проверки входных данных

if(coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return; 

Вам нужно будет заменить Maxx и MAXY с 1 больше, чем ваши максимальные значения для coorx и coory. Это гарантирует, что вы не получите ошибку плохого доступа.

bool found = false; // this will be global scope or pass it by reference 
Solve_Maze(x,y); 
// if(found) - found will be true if you found the end 

void Solve_Maze(int coorx,int coory) { 
    if(coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return; 
    else if(((Map[coorx][coory]==Start)||(Map[coorx][coory]==path))) { 
     Map[coorx][coory]=wall; 
     Solve_Maze(coorx+1,coory); 
     Solve_Maze(coorx-1,coory); 
     Solve_Maze(coorx,coory+1); 
     Solve_Maze(coorx,coory-1); 
    }else if(Map[coorx][coory]==End) { 
     cout<<"You Solved the Maze!"<<endl; 
     delete Map; 
     found = true; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^