换色器功能上的堆栈溢出错误

时间:2009-06-12 08:01:50

标签: c# .net asp.net algorithm stack-overflow

我有两种颜色“红色”也是“三文鱼”。我需要创建动态面板和面板背景颜色。这些颜色必须在两种颜色之间(红色

 public Color x, y;
        protected void Page_Load(object sender, EventArgs e)
        {
            BackGroundColorArranger(Color.Red, Color.Salmon);
        }
        void BackGroundColorArranger(Color x, Color y)
        {

            BackGroundColorArrangerBase(Convert.ToInt32((float)(x.ToArgb() + y.ToArgb()) / 2));
        }
        void BackGroundColorArrangerBase(int z)
        {
            Panel panel = new Panel();
            panel.ID = z.ToString();
            panel.Width = 150;
            panel.Height = 50;
            panel.BackColor = Color.FromArgb(z);
            this.Controls.Add(panel);
            BackGroundColorArranger(x, Color.FromArgb(z));
        }

但我怎么能这样做呢。上面的代码给我stackoverflow错误。

5 个答案:

答案 0 :(得分:4)

因为您在没有退出条件的情况下递归调用BackGroundColorArranger。这是一个提示,当您在调试器中获得堆栈溢出异常时,请转到Debug Menu - > Windows - >调用堆栈,你会立即看到问题。

答案 1 :(得分:2)

不是C#开发人员,它在我看来就像你在那里进行简单的无限递归一样。

这是一个笑话问题还是这里有什么交易?

答案 2 :(得分:0)

你得到一个堆栈溢出因为每个都相互调用(然后调用另一个,依此类推,直到堆栈溢出):

您的代码是有效的:

    void BackGroundColorArranger(Color, Color)
    {
        BackGroundColorArrangerBase(int);
    }
    void BackGroundColorArrangerBase(int)
    {
        BackGroundColorArranger(Color, Color);
    }

答案 3 :(得分:0)

你递归调用相同的函数,股票溢出错误意味着你的递归永远不会结束。

您需要更改参数,以便在方法调用自身时最终找到结束。

答案 4 :(得分:0)

正如他们所说的那样,你有一个无限的递归循环,这就是你获得Stack Overflow的原因。

快速修复从BackGroundColorArrangerBase中删除此行:

BackGroundColorArranger(x, Color.FromArgb(z));

所以它看起来像这样:

        void BackGroundColorArrangerBase(int z) 
        {
           Panel panel = new Panel();
           panel.ID = z.ToString(); //this wil generate the same id for the same pair of colors
           panel.Width = 150;
           panel.Height = 50;
           panel.BackColor = Color.FromArgb(z);
           this.Controls.Add(panel);
        }

应该停止递归。除了动态面板创建之外,它还不是很清楚你需要什么。因为代码只会创建一个面板,并且每次调用BackGroundColorArranger时都会创建一个新面板 - 使用不同的颜色对 - 因为您使用颜色对作为面板的ID。

如果您需要多个面板,请使用不同的颜色对调用BackGroundColorArranger的有限循环...如果您需要在屏幕上实际看到面板,则需要更改面板。位置在ArrangerBase中,每个面板都以固定大小的原点开始。