为什么这个程序无限循环?

时间:2011-05-23 18:03:20

标签: java

我有以下代码(它无关紧要,但对于好奇,它是方形弯曲算法实现的开始)。

问题是,它无缘无故地循环:

import java.util.*;
import java.io.*;
import java.lang.*;

class Solution
{
public static class kll
{
    int ni;
    int nj;
    int pi;
    int pj;
    int v;

    kll(){};
}

public static class g
{
    static kll[][] a;
    static int wh;
}

public static void f(int i1,int i2,int j1,int j2)
{
    int nj1,nj2;
    while (g.a[i1][i2].ni!=g.wh && g.a[i1][i2].nj!=g.wh)
    {
        i1=g.a[i1][i2].ni;
        i2=g.a[i1][i2].nj;
    }

    while (g.a[j1][j2].ni!=g.wh && g.a[j1][j2].nj!=g.wh)
    {
        j1=g.a[j1][j2].ni;
        j2=g.a[j1][j2].nj;
    }
    while (j1!=0)
    {
        nj2=g.a[j1][j2].pj;
        nj1=g.a[j1][j2].pi;
        g.a[i1][i2].ni=j1;
        g.a[i1][i2].nj=j2;
        g.a[j1][j2].pi=i1;
        g.a[j1][j2].pj=i2;
        i1=j1;
        i2=j2;
        j1=nj1;
        j2=nj2;
    }
    g.a[i1][i2].ni=g.wh;
    g.a[i1][i2].nj=g.wh;


}

public static void main(String[] args)
{
    try
    {
        FileWriter oos1 = new FileWriter("output.txt");
        File inTxt=new File("input.txt");
        Scanner kbd = new Scanner(inTxt);
        int input=kbd.nextInt();
        kbd.close();
        int number=(int)Math.pow(4,input);
        g.wh=(int)Math.sqrt(number);

        g.a=new kll[g.wh+1][g.wh+1];

        for(int i=0;i<g.wh+1;i++)
            for(int j=0;j<g.wh+1;j++)
                g.a[i][j]=new kll();

        for(int i=0;i<g.wh;i++)
            for(int j=0;j<g.wh;j++)
            {
                g.a[i][j].ni=g.wh;
                g.a[i][j].nj=g.wh;
                g.a[i][j].pi=0;
                g.a[i][j].pj=0;
                g.a[i][j].v=0;
            }

        int separator=g.wh;
        int half;
        while(separator>1)
        {
            half=separator/2;
            for(int i=0;i<half;i++)
                for(int j=0;j<separator;j++)
                    f(j,i,j,separator-1-i);
            for(int i=0;i<half;i++)
                for(int j=0;j<separator;j++)
                    f(i,j,separator-1-i,j);
            separator=half;
        }

    }
    catch (FileNotFoundException ex) {}
    catch(IOException ex) {}
}

}

我哪里出错了?也就是说,无限循环在哪里?造成它的原因是什么,我该如何解决?

编辑:

我尝试过调试器,它向我展示了无限循环:

while (j1!=0)
{
    nj2=g.a[j1][j2].pj;
    nj1=g.a[j1][j2].pi;
    g.a[i1][i2].ni=j1;
    g.a[i1][i2].nj=j2;
    g.a[j1][j2].pi=i1;
    g.a[j1][j2].pj=i2;
    i1=j1;
    i2=j2;
    j1=nj1;
    j2=nj2;
}

我不知道为什么它是无限的。当j1也为零时,nj1必须为零。出了什么问题?

1 个答案:

答案 0 :(得分:2)

简单地说,j1永远不会设置为0,因为nj1永远不会设置为0,因为g.a [ji] [j2] .pi永远不会设置为0.

放置断点并检查g.a [ji] [j2] .pi - 给定一组特定参数,您将看到它永远不会为0。

特别是,您需要查看为f()函数提供的参数,这些参数会导致该函数无限循环。

一旦确定了有问题的参数,就可以放置一个if语句,在调用该函数之前导致断点被触发 - 如果你还没有确定f()失败的原因。