Private Sub Text1.Change
Text1.Text = Text1.Text + "."
End Sub
Dim bflagAExec as Boolean
Sub A
If bflagAExec Then Exit Sub
bflagAExec = True
' КОД КОД КОД КОД
bflagAExec = False
End Sub
Хакер писал(а):Вообщето ошибка звучит так: Стек переполнен.
Происходит обычно когда процедура 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
,
а вообще код в студию
tyomitch писал(а):NIC, оверквотинг (страница цитаты на строчку текста, к тому же дублирующую предыдущий пост) есть нарушение правила №14.
NIC писал(а):Всё понял.Более не повториться.
NIC писал(а):А какой вообще размер стека в VB. На ассембере для DOS в COM я делал через ORG потому что там стек начинаеться с конца файла (<64КБ). Для EXE отдельный сегмент (64Кб).
Сейчас этот форум просматривают: Google-бот и гости: 98