Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
Just Do It!
4006 / 2362 / 638
Регистрация: 23.09.2014
Сообщений: 7,538
Записей в блоге: 2
1
.NET 4.x

Ошибка: "Не удаётся создать новую страницу для защиты стека"

02.08.2022, 15:39. Показов 7176. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что исправить в коде?

есть такой класс:
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//  TODO
//-----------------------------------------------------------------------------|
//  Три режима отображения:
//      1. Двухпанельный.
//      2. Однопанельный.
//      3. Свёрнутый в иконку на экране.
//-----------------------------------------------------------------------------| 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
 
using MLF = BDObarterNEXT.MyLib;
 
namespace BDObarterNEXT
{
    public sealed class Showmode
    {
        public Showmode(myForm myform)
        {
            dp    = new Datapos[(int)Showmode.eMode.E_END];
            dp[0] = new DataposMax(myform);
            dp[1] = new DataposMid(myform);
            dp[2] = new DataposMin(myform);
        }
 
        Datapos[] dp;
 
        public enum eMode
        {   E_MAX,
            E_MID,
            E_MIN,
            //---
            E_END
        }
 
        public void set(Showmode.eMode MODE)
        {   dp[(int)MODE].set();
        }
 
        //--------------------------------------|
        // Test.                                |<-----------------------: Тест.
        //--------------------------------------:
        public static void test(myForm myform)
        {
            Showmode smode = new Showmode(myform);
            for (Showmode.eMode i = Showmode.eMode.E_MAX; 
                                i < Showmode.eMode.E_END; ++i)
            {   smode.set      (i);
            }
        }
    }
 
    // xxx
    //---------------------------------|
    // Геометрия.                      |
    //---------------------------------:
    public interface IDP
    {
        void save();
        void load();
        void set ();
 
        Rectangle cr { get; set; }
        Point     pf { get; set; }
    }
 
    public class Datapos : IDP
    {
        protected Size cs;
 
        protected void init(myForm F)
        {
            this.cr = F.ClientRectangle;
            this.cs = F.ClientSize;
        }
 
        public virtual void save()
        {
        }
 
        public virtual void load()
        {
        }
 
        public virtual void set()
        {
        }
 
        public Point pf
        {   get { return  pf; }
            set { pf = value; }
        }
 
        public Rectangle cr
        {   get { return  cr; }
            set { cr = value; }
        }
    }
 
    public class DataposMax : Datapos
    {
        public DataposMax(myForm F)
        {
            init(F);
            pf = new Point(110, 111);
        }
 
        public override void save()
        {   
        }
 
        public override void load()
        {   
        }
 
        public override void set()
        {   MLF.textout.add("DataposMax.set()", pf.X);
        }
    }
 
    public class DataposMid : Datapos
    {
        public DataposMid(myForm F)
        {
            init(F);
            pf = new Point(220, 221);
        }
 
        public override void save()
        {
        }
 
        public override void load()
        {
        }
 
        public override void set()
        {   MLF.textout.add("DataposMid.set()", pf.X);
        }
    }
 
    public class DataposMin : Datapos
    {
        public DataposMin(myForm F)
        {
            init(F);
            pf = new Point(330, 331);
        }
 
        public override void save()
        {
        }
 
        public override void load()
        {
        }
 
        public override void set()
        {   MLF.textout.add("DataposMin.set()", pf.X);
        }
    }
    //---------------------------------.
}
запускаю тест(см. внутри класса)

выскакивает такая ошибка:
Миниатюры
Ошибка: "Не удаётся создать новую страницу для защиты стека"  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2022, 15:39
Ответы с готовыми решениями:

"Не удаётся создать новую копию защиты для стека" или как переложить данные в кучу
Собственно, ошибка представлена на скриншоте.(&quot;Не удаётся создать новую копию защиты для стека&quot;) Я...

Не удается создать новую страницу защиты для стека
Доброго времени суток. Вот есть такой кодopen System //Визначення факторіалу let rec fact n= ...

Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести эталонный символ.
Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода...

Не могу создать новую страницу
Доброго времени суток. Ребят, подскажите: когда я пытаюсь создать новую страницу - раздел в меню,...

9
Администратор
Эксперт .NET
17483 / 13716 / 5288
Регистрация: 17.03.2014
Сообщений: 28,159
Записей в блоге: 1
02.08.2022, 16:01 2
Лучший ответ Сообщение было отмечено XLAT как решение

Решение

XLAT, возможно причина в бесконечной рекурсии в этих строках
C#
92
93
94
95
96
97
98
99
100
        public Point pf
        {   get { return  pf; }
            set { pf = value; }
        }
 
        public Rectangle cr
        {   get { return  cr; }
            set { cr = value; }
        }
1
Just Do It!
4006 / 2362 / 638
Регистрация: 23.09.2014
Сообщений: 7,538
Записей в блоге: 2
02.08.2022, 16:08  [ТС] 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
возможно причина в бесконечной рекурсии в этих строках
угу,
C#
1
2
3
4
5
        Point pf1;
        public Point pf
        {   get { return  pf1; }
            set { pf1 = value; }
        }
заработало)
0
Администратор
Эксперт .NET
17483 / 13716 / 5288
Регистрация: 17.03.2014
Сообщений: 28,159
Записей в блоге: 1
02.08.2022, 16:12 4
XLAT, здесь авто-свойства можно использовать.
C#
1
2
public Point pf { get; set; }
public Rectangle cr { get; set; }
1
Just Do It!
4006 / 2362 / 638
Регистрация: 23.09.2014
Сообщений: 7,538
Записей в блоге: 2
02.08.2022, 16:32  [ТС] 5
Цитата Сообщение от OwenGlendower Посмотреть сообщение
здесь авто-свойства можно использовать.
спаб, нужный совет.

Добавлено через 14 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
здесь авто-свойства можно использовать.
ок,

раз переменную я вынес в интерфейс, знам её можно модифицировать извне,
пытаю тут:
Кликните здесь для просмотра всего текста
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
//  TODO
//-----------------------------------------------------------------------------|
//  Три режима отображения:
//      1. Двухпанельный.
//      2. Однопанельный.
//      3. Свёрнутый в иконку на экране.
//-----------------------------------------------------------------------------| 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
 
using MLF = BDObarterNEXT.MyLib;
 
namespace BDObarterNEXT
{
    public sealed class Showmode
    {
        public Showmode(myForm myform)
        {
            dp    = new Datapos[(int)Showmode.eMode.end];
            dp[0] = new DataposMax(myform);
            dp[1] = new DataposMid(myform);
            dp[2] = new DataposMin(myform);
        }
 
        public IDP[] dp;
 
        public enum eMode
        {   MAX,
            MID,
            MIN,
            ///
            end
        }
 
        public void set(Showmode.eMode MODE)
        {   dp[(int)MODE].set();
        }
 
        //--------------------------------------|
        // Test.                                |<-----------------------: Тест.
        //--------------------------------------:
        public static void test(myForm myform)
        {
            Showmode smode = new Showmode(myform);
 
//--->
            smode.dp[0].pf.X = 888; // error CS1612: 
                                    // Cannot modify the return value of 
                                    // 'BDObarterNEXT.IDP.pf' 
                                    // because it is not a variable
 
            for (Showmode.eMode i = Showmode.eMode.MAX;
                                i < Showmode.eMode.end; ++i)
            {   smode.set      (i);
            }
        }
    }
 
    // xxx
    //---------------------------------|
    // Геометрия.                      |
    //---------------------------------:
    public interface IDP
    {
        void save();
        void load();
        void set ();
 
        Rectangle cr { get; set; }
        Point     pf { get; set; }
    }
 
    public class Datapos : IDP
    {
        protected Size cs;
 
        protected void init(myForm F)
        {
                 cr = F.ClientRectangle;
            this.cs = F.ClientSize;
        }
 
        public virtual void save()
        {
        }
 
        public virtual void load()
        {
        }
 
        public virtual void set()
        {
        }
 
        public Point pf { get; set; }
 
        Rectangle cr1;
        public Rectangle cr
        {   get { return cr1; }
            set { cr1 = value; }
        }
    }
 
    public class DataposMax : Datapos
    {
        public DataposMax(myForm F)
        {
            init(F);
            pf = new Point(110, 111);
        }
 
        public override void save()
        {   
        }
 
        public override void load()
        {   
        }
 
        public override void set()
        {   MLF.textout.add("DataposMax.set()", pf.X);
        }
    }
 
    public class DataposMid : Datapos
    {
        public DataposMid(myForm F)
        {
            init(F);
            pf = new Point(220, 221);
        }
 
        public override void save()
        {
        }
 
        public override void load()
        {
        }
 
        public override void set()
        {   MLF.textout.add("DataposMid.set()", pf.X);
        }
    }
 
    public class DataposMin : Datapos
    {
        public DataposMin(myForm F)
        {
            init(F);
            pf = new Point(330, 331);
        }
 
        public override void save()
        {
        }
 
        public override void load()
        {
        }
 
        public override void set()
        {   MLF.textout.add("DataposMin.set()", pf.X);
        }
    }
    //---------------------------------.
}


вот в этом месте:
C#
50
51
52
53
54
//--->
            smode.dp[0].pf.X = 888; // error CS1612: 
                                    // Cannot modify the return value of 
                                    // 'BDObarterNEXT.IDP.pf' 
                                    // because it is not a variable
как жет так?
0
Администратор
Эксперт .NET
17483 / 13716 / 5288
Регистрация: 17.03.2014
Сообщений: 28,159
Записей в блоге: 1
02.08.2022, 17:57 6
XLAT, свойство pf имеет тип Point. Это значимый тип. Значит при чтении мы получаем копию значения из класса. Следовательно менять значение X мы будем для временной копии. Это очевидно не то что вы хотели. Чтобы защитить нас от ошибок компилятор и выдает эту ошибку.

Исправляется просто - создавайте новую Point.
C#
1
smode.dp[0].pf = new Point(888, smode.dp[0].pf.Y);
1
Just Do It!
4006 / 2362 / 638
Регистрация: 23.09.2014
Сообщений: 7,538
Записей в блоге: 2
02.08.2022, 20:20  [ТС] 7
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это значимый тип. Значит при чтении мы получаем копию значения из класса. Следовательно менять значение X мы будем для временной копии
здесь всё ясно.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
new Point
но делать релокацию памяти на таком пустяке это же уг(
если в шарпе есть GC, то значит он должен ВСЕГДА работать?
в мои крестомозги такое не влазеит.
потом кто-то будет недоумевать почему шарп тормозит, а кресты нет)

OwenGlendower, а что можно по этому поводу с ref замутить, чтобы лишний раз GC не беспокоить?

Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
smode.dp[0].pf = new Point(888, smode.dp[0].pf.Y);
такой вар без new

C#
1
2
3
            Point p              = smode.dp[0].pf; // есть надежда что p где то на стеке)
                  p.X            = 888;
                  smode.dp[0].pf = p;
выглядит тоже страшненько.

но, например, в крестах вызов new - операция дорогая: до 1000 асм команд.
а как тут - в C#?

т.е. делать 5 пересылок, чтобы модифицировать одно поле в Point, будет в разы эффективнее, чем вызов new.
Или нет?
0
Администратор
Эксперт .NET
17483 / 13716 / 5288
Регистрация: 17.03.2014
Сообщений: 28,159
Записей в блоге: 1
02.08.2022, 21:18 8
Лучший ответ Сообщение было отмечено XLAT как решение

Решение

Цитата Сообщение от XLAT Посмотреть сообщение
но делать релокацию памяти на таком пустяке это же уг(
Частично соглашусь. Частично потому что для значимого типа затраты ресурсов незначительны.

Цитата Сообщение от XLAT Посмотреть сообщение
а что можно по этому поводу с ref замутить
Можно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private Point _pf;
public Point pf
{
    get { return _pf; }
    set { _pf = value; }
}
 
public int pf_X
{
    get { return _pf.X; }
    set { _pf.X = value; }
}
 
public int pf_Y
{
    get { return _pf.Y; }
    set { _pf.Y = value; }
}
C#
1
smode.dp[0].pf_X = 888;
Цитата Сообщение от XLAT Посмотреть сообщение
если в шарпе есть GC, то значит он должен ВСЕГДА работать?
Напоминаю что мы имеем дело со значимым типом. Сборщик мусора работает со ссылочными типами.

Цитата Сообщение от XLAT Посмотреть сообщение
но, например, в крестах вызов new - операция дорогая: до 1000 асм команд.
а как тут - в C#?
Без понятия. Нужно замерять в реальных условиях.
1
Just Do It!
4006 / 2362 / 638
Регистрация: 23.09.2014
Сообщений: 7,538
Записей в блоге: 2
02.08.2022, 23:38  [ТС] 9
Цитата Сообщение от XLAT Посмотреть сообщение
с ref замутить
смотрю сюда и делаю как тут:
C#
1
2
3
4
        private    Point Z; // тип int также мимо
        public ref Point getZ()
        {   return ref Z;
        }
ваще не компилируется:
Код
error CS1519: Invalid token 'ref' in class, struct, or interface member declaration
Добавлено через 1 часа 10 минут
Цитата Сообщение от XLAT Посмотреть сообщение
error CS1519
Код
C# версии 7.0 был выпущен вместе с Visual Studio 2017. 
Ниже приведены некоторые из новых функций:
...
Локальные переменные и возвращаемые значения Ref
...
а я юзаю C# версии 4.0

ну, вообщем не сильно и хотелось ломать инкапсуляцию))
0
Администратор
Эксперт .NET
17483 / 13716 / 5288
Регистрация: 17.03.2014
Сообщений: 28,159
Записей в блоге: 1
03.08.2022, 00:02 10
XLAT, если нет возможности перейти на более новую версию VS где можно использовать новый .NET или хотя бы установить NuGet пакет с компилятором, то тогда используйте решение с отдельными свойствами для X и Y.
1
03.08.2022, 00:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2022, 00:02
Помогаю со студенческими работами здесь

Как создать новую страницу на Битриксе?
Нужно в этом разделе сайта создать ещё несколько страниц с брендами: italmoda.su/brendy Как...

Как создать новую страницу с контентом?
Добрый день. Натянул свою верстку на wordpress, хочу добавить новую страницу, пишу заголовок,...

Как создать новую веб-страницу в MVC3
Здравствуйте. Заранее сорри за делетантский вопрос. По умолчанию, когда создается веб...

Взять данные из буфера и создать новую страницу
Есть файл buffer.php: &lt;?php ob_start(); ob_clean(); ...

Как создать новую html страницу через php
Задача состоит в том, что админ заходит - называет новую страницу der например и появляется...

Нужно создать новую страницу с исходным кодом из Textarea
Есть страница, на ней один textarea и один фрейм. В textarea вручную пишем код html, нажимаем на...


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

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