【问题标题】:Stack Overflow error on Color Changer Function换色器功能上的堆栈溢出错误
【发布时间】:2009-06-12 08:01:49
【问题描述】:

我有两种颜色“红色”和“鲑鱼”。我需要创建动态面板也面板背景颜色。这些颜色必须介于两种颜色(红色

 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错误。

【问题讨论】:

  • 请为您的问题使用适当的标题 - 总结它,而不是寻求专家。
  • +1 表示“鲑鱼”是一种颜色。
  • +1 表示有“堆栈溢出”问题。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不是 C# 开发人员,在我看来你有一个简单的无限递归。

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

    【讨论】:

      【解决方案3】:

      正如他们所说,你有一个无限递归循环,这就是你得到堆栈溢出的原因。

      作为快速修复,从 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 ...如果您需要实际查看屏幕上的面板,则需要更改 panel.Location ArrangerBase 中的每个面板,现在每个面板都以固定大小从原点开始。

      【讨论】:

        【解决方案4】:

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

        你的代码是有效的:

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

        【讨论】:

          【解决方案5】:

          您正在递归调用相同的函数,库存溢出错误意味着您的递归永无止境。

          你需要改变参数,这样当方法调用自己时,它最终会找到终点。

          【讨论】:

            猜你喜欢
            • 2014-01-26
            • 2019-02-16
            • 2011-09-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多