2012-05-19 6 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

유효 좌표/값은 그들은이다, 내가 전에 좌표를 표시하는 경우 당신은 아마 확인해야합니다 첫 시작은 좌표 데이터 로거이었다 설정 (예상대로 문 그리고 모든 일 경우 그리고 다른 모든 격판 덮개는 경로이었다). –

+1

여행지로 표시된 곳을 볼 수 없습니다. 언뜻보기에, 당신은 아주 쉽게 앞뒤로 가고 결코 끝날 수없는 것처럼 보입니다. (나는 당신이 스택을 날려 버릴 것이라고 생각한다.) – Marvo

답변

0

디버거 (gdb 또는 dbx)에서 실행하십시오. 프로그램을 디버그 할 수 있도록 -g 플래그로 컴파일하십시오. 디버거를 사용하는 방법을 모른다면 google "dbx cheatsheet"를 방문하십시오. 루프에서 멈추는 위치를 파악할 수 있습니다 (추측이 맞으면). 이렇게하기 위해 디버거에서 능숙 해지는 데 걸리는 총 시간은 실제로 생각하는 데 소요되는 시간보다 적습니다.

사람들은 흔히 디버거 학습에 대한 과대 평가를하기 때문에 간단한 문제조차도 가치가 있다는 점을 분명히 주장하고 큰 문제에 대해서는 대가를 치르고 있습니다.

+0

프로그램을 실행할 때 " EXC_BAD_ACCESS "if 문에서 오류가 발생했습니다. 디버깅 할 때 오류가 다시 발생할 때까지 반복을 계속 실행합니다. –

+1

@JakeRunzer 문제는 재귀가 아니며 coorx 및 coory가 있는지 확인하지 않습니다. 유효하고 읽기 권한이없는 메모리에 액세스하고 있습니다. 프로그램에서 소유 한 메모리가 아닙니다. 함수의 다른 세 번의 반복에서 맵을 삭제할 수도 있습니다. 버퍼가 플러시되어 출력을 볼 수 없습니다. – gcochard

+0

예, "if"는 귀하의 coorx 또는 coory 중 하나가 배열의 범위를 벗어 났음을 의미하지 않습니다. 그래서 일어날 때 무엇을해야하는지 알아 내고 코드를 작성하십시오. – djechlin

2

1) if 문에 값을 반환하지 않습니다.
2) [coorx] [coory]는 항상 모든 함수 호출에서 벽에 할당되었습니다. 벽은 전역 상태를 나타 냅니까?

+0

클래스에는 시작, 끝, 벽 및 경로라는 4 개의 전용 문자가 있습니다. 그것들은 모두 유효하며 프로그램은 시작 좌표를 성공적으로 찾습니다. –

2

값이 올바르게 스택으로 반환되지 않아 함수가 void를 반환하도록 변경되었습니다. 이 경우, 글로벌 발견 변수를 사용하여 끝이 발견되었는지 확인하십시오. (함수를 실행하기 전에 매번 'found = false'를 설정해야합니다).

bool found = false; 

당신은 또한 몇 가지 입력 유효성 검사

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

당신은 coorx 및 coory에 대한 최대 값 1보다 더와 MAXX와 MAXY를 교체해야합니다에게하고 싶은. 그러면 잘못된 액세스 오류가 발생하지 않습니다.

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; 
    } 
} 
관련 문제