Слишком много ошибок во время выполнения, возможно, проблема с массивом? - PullRequest
0 голосов
/ 14 декабря 2011

У меня проблема с отображением ошибок с этим.Я использую 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 Ответ

1 голос
/ 14 декабря 2011

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

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

...