2015-01-27 2 views
1

정말 이상한 행동을 관찰합니다. 내 코드에는 버그가 있다는 것이 확실하지만 Eclipse의 동작이 너무 이상해서 아무 것도 알아 내지 못합니다.Eclipse가 프로그램 실행 중간에 영원히 실행됩니다.

첫째, 여기 내 코드는 http://pastebin.com/JCaW53GM입니다.

나는 Project Euler's problem 96을 해결하려고합니다. 즉 Knuth의 Dancing Links를 사용하여 Sudoku 해결사를 만들려고합니다. 그 --- 아무것도 후

start search 
before calling search(0 + 1) 
start search 
before calling search(1 + 1) 
start search 
before calling search(2 + 1) 
start search 
before calling search(3 + 1) 
start search 
before calling search(4 + 1) 
start search 
before calling search(5 + 1) 
start search 
before calling search(6 + 1) 
start search 
before calling search(7 + 1) 
start search 
before calling search(8 + 1) 
start search 

: 나는이 프로그램을 실행할 때마다

private static void search(int k) { 
      System.out.println("start search"); 
      if (masterHeader.right == masterHeader) { 
        return; 
      } 

      // choose column 
      Column c = new Column(""); 
      int s = Integer.MAX_VALUE; 
      for (Column j = (Column) masterHeader.right; j != masterHeader; 
          j = (Column) j.right) { 
        if (j.size < s) { 
          c = j; 
          s = j.size; 
        } 
      } 

      // dancing links 
      c.cover(); 

      for (Datum r = c.bottom; r != c; r = r.bottom) { 
        o[k] = r; 
        for (Datum j = r.right; j != r; j = r.right) { 
          j.column.cover(); 
        } 
        System.out.println("before calling search(" + k + " + 1)"); 
        search(k + 1); 
        r = o[k]; 
        c = r.column; 
        for (Datum j = r.left; j != r; j = j.left) { 
          j.uncover(); 
        } 
      } 

      c.uncover(); 
    } 

, 나는 다음과 같은 출력을 얻을 : 많은 준비 후,이 절차는 문제를 해결하기 위해 가정된다. 오류가없고 오버플로가 없으며 Eclipse는 계속 영원히 계속 실행됩니다. 나는 이것이 무엇을 의미하는지 전혀 모른다. 나는 그것이 검색에서 멈춘다는 사실을 꽤 확신한다. (9) 내 코드의 많은 부분과 관련이있다. 그러나 오류가 없으며 나는 손실에 처해 있습니다.

누구나 나를 밝힐 수 있습니까? Eclipse는 무엇을 원합니까? 나는 무엇을 잘못 했는가?

편집 : Gaaah! 나는 출력의 마지막 "검색 시작"을 완전히 간과했다. 그것은 나를 혼란스럽게 만들었다. 나는 너무 피곤했다 ... 어쨌든, 너를 괴롭히는 것에 대해 모두에게 미안. 네, 분명 무한 루프의 단순한 경우입니다. 내가 직접 디버깅 할 수 있기를 바랍니다.

+3

코드에 연결하는 대신 게시물의 해당 부분을 게시물에 포함하십시오. – rgettman

+0

Eclipse 이슈라고 생각하는 것 같군요. 대신 명령 줄이나 DrJava (또는 경량 Java 편집기)에서 실행 해 보셨습니까? – Coffee

+4

그것은 무한 루프라고합니다. 만족스럽지 않은 루프 종료 조건이있어 루프가 계속 무기한 실행됩니다. 디버거를 시작하면됩니다. – gknicker

답변

2

r != c;은 개체의 동일한 인스턴스에 대해 이야기하는 경우에만 의미가있는 표현식입니다. rc은 모두 Datum 개체이므로 exact 동일 인스턴스가 아니면 true으로 계산되지 않습니다.

아마도 Datum 클래스에 .equals을 정의하고 싶을 것입니다. 그런 다음 !r.equals(c)으로 전화를 걸 수 있습니다.

rowcolumn은 및 c보다 훨씬 간단합니다. 이러한 변수의 이름을 바꾸면됩니다.

+0

의견을 주셔서 감사합니다. 그러나 실제로는 그 아이디어입니다. 단순히 수직 목록 일 뿐이며 루프는 "최상위"요소에 도달하면 중지되어야합니다. 그리고 네, 아마 변수 이름을 바꿀 것입니다. 현재이 코드는 크 누스 (Knuth)의 논문의 의사 코드와 거의 일대일로 만 일치합니다. – Sacha

관련 문제