2011-12-14 2 views
-2

У меня возникла проблема с просмотром ошибок. Я использую TextPad4.7.3 и когда я пытаюсь сделать доску 53x53 или большие ошибки, которые я могу видеть это наСлишком много ошибок во время выполнения, возможно, проблема с массивом?

else if (move[1][m] > 0 && move[1][m] < 9){ 

if(tour(movNum + 1, (x + movCol[move[0][m]]), (y + movRow[move[0][m]]), bSize, board)){ 

break;}} 

Так как это рекурсивная программа, я сомневаюсь, что эта линия является реальной проблемой. Список ошибок настолько длинный, что я не вижу вершины, где будет указывать реальную позицию ошибки. Кто-нибудь знает что-нибудь, что может правильно регистрировать мои ошибки или метод, чтобы увидеть ошибку. Или если кто-то знает, почему, когда я использую номер 53 или больше, это дает мне огромный список ошибок вместо того, чтобы продолжать работать? Это было задание, но на данный момент я просто пытаюсь исправить это для себя. Любая помощь будет оценена по достоинству.

-WBM

import java.util.Scanner; 
public class Tour { 

// Knight moves 
    static int movCol[] = { 1, 2, 2, 1, -1, -2, -2, -1}; 
    static int movRow[] = {-2, -1, 1, 2, 2, 1, -1, -2}; 

// Main method 
    static public void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.print("What are the board's Dimentions?"); 
     int bSize = scan.nextInt(); 
     int board[][] = new int[bSize][bSize]; 
     System.out.print("Start on what column?"); 
     int positionY = scan.nextInt(); 
     System.out.print("Start on what row?"); 
     int positionX = scan.nextInt(); 
     System.out.println(); 
     for (int i = 0; i < bSize; i=i+1) { 
      for (int j = 0; j < bSize; j=j+1) { 
       board[i][j] = -1; 
      } 
     } 
     tour(0, positionX - 1, positionY - 1, bSize, board); 
    } 



    static void printBoard(int board[][]) { 
     for(int i = 0; i < board.length; i=i+1){ 
      for(int j = 0; j < board[0].length; j=j+1){ 
       if (board.length < 11){ 
        System.out.printf("%3d", board[i][j]); 
       } 
       else if (board.length < 32){ 
        System.out.printf("%4d", board[i][j]); 
       } 
       else if (board.length < 101){ 
        System.out.printf("%5d", board[i][j]); 
       } 
       else if (board.length < 317){ 
        System.out.printf("%6d", board[i][j]); 
       } 
       else if (board.length < 1001){ 
        System.out.printf("%7d", board[i][j]); 
       } 
       else if (board.length < 3163){ 
        System.out.printf("%8d", board[i][j]); 
       } 
       else if (board.length < 10001){ 
        System.out.printf("%9d", board[i][j]); 
       } 
      } 
      System.out.println("\n"); 
     } 
    } 

    static boolean tour(int movNum, int x, int y, int bSize, int board[][]) { 
     boolean success = true; 
     board[x][y] = movNum; 
     if((movNum < ((bSize * bSize) - 1))){ 
      int move[][] = new int[2][8]; 
      for(int i = 0; i < 8; i=i+1){ 
       if((x + movCol[i]) >= 0 && (x + movCol[i]) < bSize && (y + movRow[i]) >= 0 && (y + movRow[i]) < bSize){ 
        if(board[x + movCol[i]][y + movRow[i]] < 0){ 
         move[0][i] = i; // marks all possible moves 
         for(int h=0; h<8; h=h+1){ 

          if((x + movCol[i] + movCol[h]) >= 0 && (x + movCol[i] + movCol[h]) < bSize && (y + movRow[i] + movRow[h]) >= 0 && (y + movRow[i] + movRow[h]) < bSize){ 

           if(board[x + movCol[i] + movCol[h]][y + movRow[i] + movRow[h]] < 0){ 

            move[1][i] = move[1][i] + 1; 
           } 
          } 
         } 
        } 
        else { 
         move[0][i] = i; 
         move[1][i] = 9; 
        } 
       } 
       else { 
        move[0][i] = i; 
        move[1][i] = 9; 
       } 
      } 
      for(int j = 0; j < 7; j=j+1){  
       for(int k = 0; k < 7; k=k+1){ 
        if (move[1][k]> move[1][k+1]){ 
         int lower = move[1][k+1]; 
         int lower2 = move[0][k+1]; 
         int upper = move[1][k]; 
         int upper2 = move[0][k]; 
         move[1][k] = lower; 
         move[0][k] = lower2; 
         move[1][k+1] = upper; 
         move[0][k+1] = upper2; 
        } 
       } 
      } 

      for(int m = 0; m < 8; m=m+1){ 
       if (move[1][m] == 0 && movNum == ((bSize * bSize) - 2)){ 

        if(tour(movNum + 1, (x + movCol[move[0][m]]), (y + movRow[move[0][m]]), bSize, board)){ 
         break; 
        } 
       } 
       else if (move[1][m] > 0 && move[1][m] < 9){ 

        if(tour(movNum + 1, (x + movCol[move[0][m]]), (y + movRow[move[0][m]]), bSize, board)){ 
         break; 
        } 
       } 
      } 
      success = false; 
      board[x][y] = -1; 
     } 
     else{ 
      printBoard(board);  
      System.out.println("\n"); 
      System.exit(0); 
     } 
     return success; 
    } 
} 
+1

«Ошибка». Какая ошибка? Переполнение стека? Что-то другое? Вы пытаетесь сделать рыцарский тур на доске 53x53 ?! –

+0

at Tour.tour (Tour.java:112) его массивный список. Я не могу видеть top = ( – user1096849

+0

Не где, что. –

ответ

1

Похоже, что это, вероятно, StackOverflowError. Консоль Windows имеет связанный с ней диалог настроек. Используйте эти настройки, чтобы установить «буфер прокрутки» в 4000 строк (вместо значения по умолчанию, которое равно 12 или что-то еще.) Затем вы сможете прокручивать вверх и видеть, что на самом деле представляет собой сообщение об ошибке.

Предполагая, что это действительно проблема переполнения стека, один из рекурсивных вызовов, вероятно, выполняется без соответствующего условия выхода; внимательно изучите их. Есть блок if вокруг двух рекурсивных вызовов, но оба вызова имеют точно такие же аргументы; что подсказывает мне, что, возможно, там есть опечатка?

+0

Исключение из потока «main» java.lang.StackOverflowError TY! Этот буфер прокрутки отлично работает! = 'DI может видеть ошибку! – user1096849

+0

Обратите внимание, что вы можете передать '-Xss' для вашей виртуальной машины Java для увеличения размера стека (например,' -Xss4096k'). – darvids0n

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