Ошибка переполнения стека в функции смены цвета - PullRequest
3 голосов
/ 12 июня 2009

у меня есть два цвета "красный" и "лосось". Мне нужно создать динамически панель и цвет фона панели. Эти цвета должны быть между двумя цветами (красный

 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));
        }

Но как я могу это сделать. Приведенные выше коды дают мне ошибку переполнения стека.

Ответы [ 5 ]

4 голосов
/ 12 июня 2009

Поскольку вы вызываете BackGroundColorArranger рекурсивно без условия выхода. Вот совет, когда вы получаете исключение переполнения стека в отладчике, перейдите в меню «Отладка» -> Windows -> «Стек вызовов», и вы сразу увидите проблему.

2 голосов
/ 12 июня 2009

Не будучи разработчиком C #, мне кажется, что у вас есть простая бесконечная рекурсия там.

Это вопрос шутки или в чем тут дело?

0 голосов
/ 12 июня 2009

Как они сказали, у вас бесконечный рекурсивный цикл, и именно поэтому вы получаете переполнение стека.

В качестве быстрого исправления удалите эту строку из 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 называется -WITH DIFFERENT COLOR PAIR-, поскольку вы используете пару цветов в качестве идентификатора для панели.

Если вам нужно более одной панели, создайте конечный цикл, вызывающий BackGroundColorArranger с разными парами цветов ... если вам нужно реально видеть панели на экране, вам нужно изменить панель. Расположение каждая в ArrangerBase, так как теперь каждая панель начинается в начале координат с фиксированным размером.

0 голосов
/ 12 июня 2009

Вы рекурсивно вызываете ту же функцию, ошибка переполнения запаса означает, что ваша рекурсия никогда не заканчивается.

Вам необходимо изменить параметры, чтобы при вызове метода он в конце концов находил конец.

0 голосов
/ 12 июня 2009

Вы получаете переполнение стека, потому что каждый из них вызывает друг друга (который затем вызывает другой, и так далее, пока стек не переполняется):

Ваш код эффективен:

    void BackGroundColorArranger(Color, Color)
    {
        BackGroundColorArrangerBase(int);
    }
    void BackGroundColorArrangerBase(int)
    {
        BackGroundColorArranger(Color, Color);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...