Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
1

Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll

30.11.2015, 19:15. Показов 3537. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Столкнулся со следующей проблемой:
При запуске вылезает "Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll"
Вот код:
Form1.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Box
{
    public partial class Form1 : Form
    {
        private Ball ball;
        private Box box0 = new Box();
        private Box box1 = new Box();
        private Box box2 = new Box();
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
            game_data game_data = new game_data();
            game_data.reset();
            box0 = new Box { Bounds = new RectangleF((Width / 4) - 50, Height / 2, 80, 30) };
            box1 = new Box { Bounds = new RectangleF((Width / 4) * 2 - 50, Height / 2, 80, 30) };
            box2 = new Box { Bounds = new RectangleF((Width / 4) * 3 - 50, Height / 2, 80, 30) };
        }
    }
    class Ball
    {
        public PointF Location { get; set; }
        public float Radius { get; set; }
        public float Speed { get; set; }
        public Ball()
        {
            Radius = 10;
        }
        public void Update(float dt, int box)
        {
            Speed = 9.8f * dt;
            Location = new PointF((433 / 4) * (box + 1) - 10, Location.Y + Speed * dt);
        }
    }
    class Box
    {
        public RectangleF Bounds;
    }
    class game_data
    {
        public int ochki { get; set; }
        public int ball_sh { get; set; }
        public int level { get; set; }
        public float mnoz { get; set; }
        public int[,] ball_data{ get; set; }
        public void reset()
        {
            ball_data = new int[3,3];
            ochki = 0;
            ball_sh = 5;
            level = 1;
            mnoz = 1f;
            for (int i = 0; i <= 2; i++)
                for (int j = 0; j <= 2; j++)
                    ball_data[i, j] = 0;
            update_label();
        }
        public int[] next_ball_random ()
        {
            int[] mas = new int[2];
            Random randObj = new Random();
            for (int i = 0; i <= 1; i++)
                mas[i] = randObj.Next(0, 3);
            return mas;
        }
        public void update_data (int correct)
        {
            ochki += correct * (int)(10 * mnoz);
            mnoz += level / 10;
            //ball_sh += (int)((level+10) - Math.IEEERemainder((double)(level + 10),(double)(10))) / 10 ;
            ball_sh += (int)Math.Truncate((double)((level + 10) / 10));
            level++;
            update_label();
        }
        private void update_label()
        {
            Form1 Form1 = new Form1();
            Form1.label1.Text = "Уровень " + level;
            Form1.label2.Text = "Очки " + ochki;
        }
    }
}
Form1.Designer.cs: (Я его почти не трогал, только label1 и label2 сделал public в самом конце)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
namespace Box
{
    partial class Form1
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
 #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.button2 = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.button1.Location = new System.Drawing.Point(6, 5);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(74, 31);
            this.button1.TabIndex = 1;
            this.button1.Text = "Старт";
            this.button1.UseVisualStyleBackColor = true;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.label1.Location = new System.Drawing.Point(86, 12);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(75, 17);
            this.label1.TabIndex = 2;
            this.label1.Text = "Уровень 0";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.label2.Location = new System.Drawing.Point(178, 12);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(70, 17);
            this.label2.TabIndex = 3;
            this.label2.Text = "Очки 000";
            // 
            // groupBox1
            // 
            this.groupBox1.Controls.Add(this.button2);
            this.groupBox1.Controls.Add(this.button1);
            this.groupBox1.Controls.Add(this.label1);
            this.groupBox1.Controls.Add(this.label2);
            this.groupBox1.Location = new System.Drawing.Point(0, 0);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(418, 35);
            this.groupBox1.TabIndex = 4;
            this.groupBox1.TabStop = false;
            // 
            // button2
            // 
            this.button2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.button2.Location = new System.Drawing.Point(317, 5);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(95, 31);
            this.button2.TabIndex = 5;
            this.button2.Text = "Конец игры";
            this.button2.UseVisualStyleBackColor = true;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(417, 293);
            this.Controls.Add(this.groupBox1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.Name = "Form1";
            this.Text = "Game";
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private System.Windows.Forms.Button button1;
        public System.Windows.Forms.Label label1;
        public System.Windows.Forms.Label label2;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.Button button2;
    }
}
Program.cs: (совсем не трогал)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Box
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Все проблемы из за
C#
1
2
            game_data game_data = new game_data();
            game_data.reset();
в Form1.cs. Если удалить game_data.reset(); то всё работает без всяких проблем
отладчик указывает на
C#
1
this.groupBox1.ResumeLayout(false);
(Это Form1 в генерированном коде)
ради эксперимента попробовал поставить true тогда отладчик стал указывать на
C#
1
this.ResumeLayout(false);
(Это последняя строка в генерированном коде)
В гугле кроме того что и так пишет отладчик (он кстати пишет "Убедитесь в отсутствии бесконечного цикла или рекурсии.") нашёл случай с двумя формами, но описанное там решение только для форм.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2015, 19:15
Ответы с готовыми решениями:

Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll
Есть класс Controls и класс формы. При нажатии на кнопку, создается другая кнопка. В классе...

Необработанное исключение типа "System.ArgumentException" в System.Windows.Forms.dll
Всем привет, пытаюсь сделать переход на форму по кнопке но вылазит следующее: С другими кнопками...

Необработанное исключение типа "System.IO.FileNotFoundException" произошло в System.Drawing.dll
Выскакивает вот такая ошибка, не знаю, что делать. Я начинающий программист, очень прошу объяснить...

Необработанное исключение типа "System.ArgumentException" в System.Drawing.dll
Доброго времени суток. Имеется проект на C# &amp; Windows Forms. В коде основной формы имеется...

8
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
30.11.2015, 20:25 2
C#
1
2
3
4
5
6
        private void update_label()
        {
            Form1 Form1 = new Form1();
            Form1.label1.Text = "Уровень " + level;
            Form1.label2.Text = "Очки " + ochki;
        }
Что это?
0
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
30.11.2015, 20:51  [ТС] 3
Someone007, Этот метод должен обновлять значение label1 и label2
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
30.11.2015, 22:48 4
Лучший ответ Сообщение было отмечено Xkimos как решение

Решение

Цитата Сообщение от Xkimos Посмотреть сообщение
Этот метод должен обновлять значение label1 и label2
Где? Будет ли какое-либо отношение иметь новая Form1 к той, что была создана в 19-й строке Program.cs?
Вариант передачи данных:
1) Перенесите в класс Form1 метод update_label():
C#
1
2
3
4
5
private void update_label(int level, int score)
{
    label1.Text = "Уровень " + level.ToString();
    label2.Text = "Очки " + score.ToString();
}
2) объявляете в неймспейсе публичного делегата:
C#
1
public  delegate void SetLabels (int level, int score);
3) в классе game_data добавляете публичное поле типа ранее созданного делегата:
C#
1
public SetLabels setLabels;
4) в классе Form1 после создания объекта game_data инициализируете поле setLabels
game_data.setLabels = update_label;

5) в методах класса game_data вместо вызова
C#
1
update_label();
вызываете setLabels и передаете в форму значения:
C#
1
setLabels(level, ochki); //но я бы ochki переименовал в score, points и т.п., Level ведь не назвали словом uroven
1
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
30.11.2015, 23:26  [ТС] 5
Даценд, Новой формы не будет, всё происходит в одной форме.

Добавлено через 20 минут
Даценд, сlass game_date Нужен для управления "постоянными" данными игры
Mетод update_labe должен обновлять значения уровня и счёта при каждом пройденном уровне (update_data пересчитывает значения) или же в случаи если пользователь решил начать новую игру (reset сбрасывает все значения на начальные)
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
01.12.2015, 00:49 6
Цитата Сообщение от Xkimos Посмотреть сообщение
Новой формы не будет, всё происходит в одной форме.
Зачем тогда создается еще один экземпляр Form1:
Цитата Сообщение от Someone007 Посмотреть сообщение
Form1 Form1 = new Form1();
В предыдущем посте я показал, как можно из класса game_date управлять элементами label1 и label2 на форме.
1
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
01.12.2015, 03:45  [ТС] 7
Даценд, я учёл все ваши рекомендации и проблема с System.StackOverflowException вродебы решена, но появилось предупреждение "Полю "Box.game_data.setLabels" нигде не присваивается значение, и оно обязательно содержит значение по умолчанию null" (Строка 57)
Вот обновлённый код:
Form1.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Box
{
    public delegate void SetLabels(int level, int score);
    public partial class Form1 : Form
    {
        private Ball ball;
        private Box box0 = new Box();
        private Box box1 = new Box();
        private Box box2 = new Box();
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
            game_data game_data = new game_data();
            game_data.reset();
            box0 = new Box { Bounds = new RectangleF((Width / 4) - 50, Height / 2, 80, 30) };
            box1 = new Box { Bounds = new RectangleF((Width / 4) * 2 - 50, Height / 2, 80, 30) };
            box2 = new Box { Bounds = new RectangleF((Width / 4) * 3 - 50, Height / 2, 80, 30) };
        }
        private void update_label(int level, int score)
        {
            label1.Text = "Уровень " + level.ToString();
            label2.Text = "Очки " + score.ToString();
        }
    }
    class Ball
    {
        public PointF Location { get; set; }
        public float Radius { get; set; }
        public float Speed { get; set; }
        public Ball()
        {
            Radius = 10;
        }
        public void Update(float dt, int box)
        {
            Speed = 9.8f * dt;
            Location = new PointF((433 / 4) * (box + 1) - 10, Location.Y + Speed * dt);
        }
    }
    class Box
    {
        public RectangleF Bounds;
    }
    class game_data
    {
        public SetLabels setLabels;
        public int points { get; set; }
        public int ball_sh { get; set; }
        public int level { get; set; }
        public float mnoz { get; set; }
        public int[,] ball_data{ get; set; }
        public void reset()
        {
            ball_data = new int[3,3];
            points = 0;
            ball_sh = 5;
            level = 1;
            mnoz = 1f;
            for (int i = 0; i <= 2; i++)
                for (int j = 0; j <= 2; j++)
                    ball_data[i, j] = 0;
            setLabels(level, points);
        }
        public int[] next_ball_random ()
        {
            int[] mas = new int[2];
            Random randObj = new Random();
            for (int i = 0; i <= 1; i++)
                mas[i] = randObj.Next(0, 3);
            return mas;
        }
        public void update_data (int correct)
        {
            points += correct * (int)(10 * mnoz);
            mnoz += level / 10;
            //ball_sh += (int)((level+10) - Math.IEEERemainder((double)(level + 10),(double)(10))) / 10 ;
            ball_sh += (int)Math.Truncate((double)((level + 10) / 10));
            level++;
            setLabels(level, points);
        }
    }
}
При попытки запустить на строке 73 вылезает Необработанное исключение типа "System.NullReferenceException" в Box.exe. Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Судя по советам по устранению неполадок это именно из за того что setLabels = null
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
01.12.2015, 06:23 8
Цитата Сообщение от Xkimos Посмотреть сообщение
При попытки запустить на строке 73 вылезает Необработанное исключение типа "System.NullReferenceException" в Box.exe. Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Судя по советам по устранению неполадок это именно из за того что setLabels = null
Потому что
Цитата Сообщение от Даценд Посмотреть сообщение
4) в классе Form1 после создания объекта game_data инициализируете поле setLabels
game_data.setLabels = update_label;
пропустили.
1
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
01.12.2015, 12:31  [ТС] 9
Даценд, Someone007, Большое спасибо, очень сильно помогли.
0
01.12.2015, 12:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2015, 12:31
Помогаю со студенческими работами здесь

Необработанное исключение типа "System.IO.FileNotFoundException" в System.Drawing.dll
Пытаюсь добавить картинку в форму через код. Пользуюсь строчкой: pictureBox1.Image =...

Необработанное исключение типа "System.ArgumentException" в System.Drawing.dll
Пишу приложение для работы с Графами (по учёбе). Есть Панель, в которой я рисую. Заполняю...

Как исправить исключение System.StackOverflowException в System.Drawing.dll
An unhandled exception of type 'System.StackOverflowException' occurred in System.Drawing.dll что...

Возникает ошибка "необработанное исключение типа System.StackOverflowException"
Привет. Возникает ошибка &quot;необработанное исключение типа System.StackOverflowException&quot; На этой...

Бесконечная рекурсия или необработанное исключение типа "System.StackOverflowException"
Здравствуйте я столкнулся с такой проблемой: Необработанное исключение типа...

Ошибка Sql запроса, Необработанное исключение типа "System.Data.OleDb.OleDbException" в System.Data.dll
Необработанное исключение типа &quot;System.Data.OleDb.OleDbException&quot; в System.Data.dll ...

Необработанное исключение типа "System.Data.SqlClient.SqlException" в System.Data.dll
Здраствуйте,помогите пожалуйста бедной девушке( При компилировании выдает ошибку : Необработанное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru