繁体   English   中英

stackoverflow异常未处理

[英]stackoverflow exception was unhandled

在下面的代码中,它应该乘以2个数字。 它适用于3位数和少于3位数的数字,但是当我给出4位数或更大的数字时,它会给出运行时错误: stackoverflow exception was unhandled 我已经评论了问题所在。 我以为问题是在int定义变量,并长时间更改了它们,但问题仍然存在。 错误在哪里?

编辑:现在,您如何看待问题?它什么都没做

        public long Prod2(long u, long v)
    {
        var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
        int n = Math.Max((int)Math.Floor(Math.Log10(u) + 1),(int)Math.Floor(Math.Log10(v) + 1));        
        int threshold = 3;

        if (u == 0 || v == 0)
        {
            return 0;
        }
        else if (n <= threshold)
        {
            return u * v;
        }
        else
        {
            int m = (int)Math.Ceiling(n / 2.0);

            int x = (int)(u / Math.Pow(10, m));
            int y = (int)(u % Math.Pow(10, m));
            int w = (int)(u / Math.Pow(10, m));
            int z = (int)(v % Math.Pow(10, m));

            long r = Prod2(x + y, w + z);
            long p = Prod2(x, w);
            long q = Prod2(y, z);

            return p * (long)Math.Pow(10, 2 * m) + (r - p - q) * (long)Math.Pow(10, m) + q;
            long result = Prod2(numbers[0], numbers[1]);
            textBox1.Text = result.ToString();
        }
    }

您现在正在进入无限递归循环

 long result = bigzarb(x, w) * Math.Pow(10, m) + (bigzarb(x, w) + bigzarb(w, y)) * Math.Pow(10, m) + bigzarb(y, z);///here
    textBox1.Text = result.ToString();

我注意到只有在intn > 3时才执行此行,所以也许您那里有逻辑错误?

更新:阅读您的评论后,我可以看到该测试的目的是说“如果此字符串的长度<= 3,则...”,而实际上是这样写的:“如果此转换后的字符串的值是<= 3那么...”

简而言之,您可能会遇到以下情况:

function bigzarb()
{
    bigzarb()
}

只要textBox7中的数字> 3,即未封闭的递归循环,将不可避免地成为stackoverflow。

在有问题的线上放置一个断点,您将很快发现问题。 在不知道您的方法做什么的情况下(我无法识别算法),在清理它方面我无济于事,但是第一步可能是要有一个getout子句有条件地从函数中返回。 但是,我还看到您在使用输入参数uv之前将它们覆盖了,所以也许您在算法中犯了一个错误?

编辑:我已经为您完全翻译了本书中描述的算法:

public long Prod2(long u, long v)
{
    int n = Math.Max((int)Math.Floor(Math.Log10(u) + 1), (int)Math.Floor(Math.Log10(v) + 1));
    int threshold = 3;

    if(u == 0 || v == 0)
    {
        return 0;
    }
    else if(n <= threshold)
    {
        return u * v;
    }
    else
    {
        int m = (int)Math.Ceiling(n / 2.0);

        int x = (int)(u / Math.Pow(10, m));
        int y = (int)(u % Math.Pow(10, m));
        int w = (int)(u / Math.Pow(10, m));
        int z = (int)(v % Math.Pow(10, m));

        long r = Prod2(x + y, w + z);
        long p = Prod2(x, w);
        long q = Prod2(y, z);

        return p * (long)Math.Pow(10, 2 * m) + (r - p - q) * (long)Math.Pow(10, m) + q;
    }
}

为了获得正确的结果,可以从其他类似的方法中调用此方法:

void Main()
{

    // Call the method and store the result in variable 'r'.
    long r = Prod2(1234, 5678);
    Console.WriteLine(r);

    /////////////////////////////////
    //
    // OR - In your case read from textBox7 and then store the result in textBox1    
    //
    /////////////////////////////////
    var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
    long result = prod2(numbers[0], numbers[1]);
    textBox1.Text = result.ToString();
}

因此,在事件处理程序中,例如对于button1 ,您可以执行以下操作来进行调用:

public void button1_Click()
{
    var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
    long result = prod2(numbers[0], numbers[1]);
    textBox1.Text = result.ToString();
}

不要修改我拥有的Prod2 ,只需将其粘贴到您的代码中即可。 这样,Prod2会进行计算,然后您的button1_Click控制输入以及如何处理输出

Pow方法返回double,因此我认为您的x,y,z,w和z也应声明为double。

您将获得递归调用的“ StackoverFlow”。 最好模制代码中的孔。 我建议您改变逻辑。

static int callStack = 0;

    public double bigzarb(long u, long v)
    {
        callStack++;
         ............
         ............

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM