Вне стекового пространства

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Вне стекового пространства

Сообщение Sun07 » 01.06.2006 (Чт) 0:54

У меня при выполнении программы вылазит "Ошибка времени выполнения '28'. Вне стекового пространства". Она появляется при добавлении в мою процедуру пары безобидных строчек. Думаю, что на размер кода процедуры есть ограничение или как?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 01.06.2006 (Чт) 1:00

Покажи код.
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2006 (Чт) 1:07

Вообщето ошибка звучит так: Стек переполнен.

Происходит обычно когда процедура A вызывает из-себя самой - себя самому. Вообще-то это называется рекурсия. Но когда это дело неконтролируемое и происходит бесконечно - стек вызовов заполняется до предела.

Так же может быть такой случай:
Процедура A вызывает процедуру B
Процедура B вызывает процедуру A, и так по кругу.

Классический пример:
Код: Выделить всё
Private Sub Text1.Change
Text1.Text = Text1.Text + "."
End Sub


пример добавляет точку в конец введённого текста. Но если подумать как это всё происходит:
1) Пользователь хочет ввести в TextBox слово "Привет"
2) Она нажимает "П"
3) Симов вводится в текстбокс
4) Содержимое текстобка меняется => происходит событие Change
5) К "П" добавляется точка, получается "П.", это действие меняет содержимое TextBox'а и повторяется пункт 5.

И так происходит до того момента пока прога не вывалится с 28 ошибкой.

Как бороться: не делать так. Если не получается "не делать так", то создавать булевскую флаговую переменную, и все опасные процедуры делать так:
Код: Выделить всё
Dim bflagAExec as Boolean
Sub A
   If bflagAExec Then Exit Sub
   bflagAExec = True
       ' КОД КОД КОД КОД
   bflagAExec = False
End Sub

,

а вообще код в студию
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 01.06.2006 (Чт) 11:30

Спасибо, всё так и есть, как сказал Хакер!

NIC
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 175
Зарегистрирован: 26.04.2005 (Вт) 4:50

Сообщение NIC » 01.06.2006 (Чт) 21:58

Хакер писал(а):Вообщето ошибка звучит так: Стек переполнен.

Происходит обычно когда процедура A вызывает из-себя самой - себя самому. Вообще-то это называется рекурсия. Но когда это дело неконтролируемое и происходит бесконечно - стек вызовов заполняется до предела.

Так же может быть такой случай:
Процедура A вызывает процедуру B
Процедура B вызывает процедуру A, и так по кругу.

Классический пример:
Код: Выделить всё
Private Sub Text1.Change
Text1.Text = Text1.Text + "."
End Sub


пример добавляет точку в конец введённого текста. Но если подумать как это всё происходит:
1) Пользователь хочет ввести в TextBox слово "Привет"
2) Она нажимает "П"
3) Симов вводится в текстбокс
4) Содержимое текстобка меняется => происходит событие Change
5) К "П" добавляется точка, получается "П.", это действие меняет содержимое TextBox'а и повторяется пункт 5.

И так происходит до того момента пока прога не вывалится с 28 ошибкой.

Как бороться: не делать так. Если не получается "не делать так", то создавать булевскую флаговую переменную, и все опасные процедуры делать так:
Код: Выделить всё
Dim bflagAExec as Boolean
Sub A
   If bflagAExec Then Exit Sub
   bflagAExec = True
       ' КОД КОД КОД КОД
   bflagAExec = False
End Sub

,

а вообще код в студию


А какой вообще размер стека в VB. На ассембере для DOS в COM я делал через ORG потому что там стек начинаеться с конца файла (<64КБ). Для EXE отдельный сегмент (64Кб). :?:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2006 (Чт) 22:03

tyomitch писал(а):NIC, оверквотинг (страница цитаты на строчку текста, к тому же дублирующую предыдущий пост) есть нарушение правила №14.

NIC писал(а):Всё понял.Более не повториться. :wink:

Опять?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.06.2006 (Чт) 22:42

NIC писал(а):А какой вообще размер стека в VB. На ассембере для DOS в COM я делал через ORG потому что там стек начинаеться с конца файла (<64КБ). Для EXE отдельный сегмент (64Кб). :?:

См. сюда.
Ассемберщик, блин.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 73

    TopList  
cron