Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 4
1

Out of stack space

11.03.2015, 12:47. Просмотров 2427. Ответов 7
Метки нет (Все метки)


Добрый день.
Разбираюсь с формами VBA, написал следующий код.
Он выводит квадратный объект перемещающийся в замкнутой области по заданному алгоритму.
Скорость движения можно менять, так же выводится дополнительная информация(скорость, координаты, размеры рабочей области)
Проблема в том, что спустя несколько минут(3-5) после запуска программа вываливается в out of stack.
Никакие данные кроме отскоков не накапливаются. На момент переполнения буфера на максимальной скорости количество отскоков доходит до ~6000.
Visual Basic
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
172
173
174
175
176
177
178
179
Public Sub Form_Run()
 
''размеры рабочей области
x = 300
y = 300
 
 
wt = 20 ''начальная задержка между сдвигами(обратнопропорциональна скорости движения объекта
 
sh = 0.6 '' методом экспериментов установлено, что минимальный сдвиг объекта возможен на 0.50000000000000001(видимо в бесконечном периуде)
 
pong = -1 ''Счетчик отскоков
 
''Формирование формы
UserForm2.Frame1.Visible = True
UserForm2.TextBox1.Visible = False
UserForm2.TextBox2.Visible = False
UserForm2.Label1.Visible = True
UserForm2.Label2.Visible = True
UserForm2.Label3.Visible = True
UserForm2.Label4.Visible = True
 
UserForm2.Height = x
UserForm2.Width = y
 
UserForm2.Frame1.top = 1
UserForm2.Frame1.left = 1
UserForm2.Frame1.Height = UserForm2.Height - 161 ''100 на рабочую область, 21 на заголовки и бордюры
UserForm2.Frame1.Width = UserForm2.Width - 7 ''7 на бордюры
''методом экспериментов установлено, что рамка равна 7(3,5 на сторону), заголовок равен 14
 
 
UserForm2.CommandButton1.Width = 20
UserForm2.CommandButton1.Height = 20
UserForm2.CommandButton1.caption = ""
UserForm2.CommandButton1.top = UserForm2.Frame1.top - 1
UserForm2.CommandButton1.left = UserForm2.Frame1.left - 1
 
UserForm2.CommandButton2.Width = 40
UserForm2.CommandButton2.Height = 30
UserForm2.CommandButton2.caption = pong & vbNewLine & "stop"
UserForm2.CommandButton2.top = UserForm2.Frame1.Height + 100
UserForm2.CommandButton2.left = UserForm2.Frame1.Width / 2 - UserForm2.CommandButton2.Width / 2
 
UserForm2.Label1.Width = 30
UserForm2.Label1.Height = 20
UserForm2.Label1.top = UserForm2.Frame1.Height + 10
UserForm2.Label1.left = UserForm2.Frame1.left + 10
UserForm2.Label1.caption = UserForm2.CommandButton1.left
 
UserForm2.Label2.Width = 30
UserForm2.Label2.Height = 20
UserForm2.Label2.top = UserForm2.Frame1.Height + 40
UserForm2.Label2.left = UserForm2.Frame1.left + 10
UserForm2.Label2.caption = UserForm2.CommandButton1.top
 
UserForm2.Label3.Width = 150
UserForm2.Label3.Height = 20
UserForm2.Label3.top = UserForm2.Frame1.Height + 70
UserForm2.Label3.left = UserForm2.Frame1.left + 10
UserForm2.Label3.caption = UserForm2.Frame1.Width & " X " & UserForm2.Frame1.Height & "(" & UserForm2.Width & " X " & UserForm2.Height & ")"
 
UserForm2.Label4.Width = 30
UserForm2.Label4.Height = 20
UserForm2.Label4.top = UserForm2.Label2.top
UserForm2.Label4.left = UserForm2.Label2.left + UserForm2.Label2.Width + 20
UserForm2.Label4.caption = wt
 
UserForm2.SpinButton1.top = UserForm2.Label1.top
UserForm2.SpinButton1.left = UserForm2.Label1.left + UserForm2.Label1.Width + 20
 
UserForm2.Show
 
''запуск цикла
bottom_right
 
End Sub
 
 
 
Sub SleepVB(mSeconds)
 
DoEvents
Sleep mSeconds
 
End Sub
 
 
 
Public Sub repaint()
''Процедура обновления содержимого формы. Выполняется после каждого пересчета координат объекта
check
UserForm2.Label1.caption = UserForm2.CommandButton1.top
UserForm2.Label2.caption = UserForm2.CommandButton1.left
UserForm2.Label4.caption = wt
UserForm2.CommandButton2.caption = pong & vbNewLine & "stop"
 
''Процедура задержки
SleepVB wt
 
End Sub
 
 
Public Sub bottom_right()
''Следующие 4 процедуры проссчитывают движение объекта
Test1
 
Do While UserForm2.CommandButton1.top < UserForm2.Frame1.Height - 24 ''размеры кнопки 20+ бордюр 2 с каждой стороны
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top + sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left + sh
    repaint
    
    If UserForm2.CommandButton1.left > UserForm2.Frame1.Width - 25 Then
        bottom_left
    End If
Loop
 
top_right
 
End Sub
 
 
Public Sub top_right()
 
Test1
 
Do While UserForm2.CommandButton1.left < UserForm2.Frame1.Width - 24  ''226
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top - sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left + sh
    repaint
    
    If UserForm2.CommandButton1.top < UserForm2.Frame1.top Then
        bottom_right
    End If
Loop
 
top_left
 
End Sub
 
Public Sub top_left()
 
Test1
 
Do While UserForm2.CommandButton1.top > UserForm2.Frame1.top - 1
    
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top - sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left - sh
    repaint
    
    If UserForm2.CommandButton1.left < UserForm2.Frame1.left Then
        top_right
    End If
 
Loop
 
bottom_left
 
End Sub
 
Public Sub bottom_left()
 
Test1
 
Do While UserForm2.CommandButton1.left > UserForm2.Frame1.left - 1
 
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top + sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left - sh
    repaint
    
    If UserForm2.CommandButton1.top > UserForm2.Frame1.Height - 25 Then
        top_left
    End If
 
Loop
 
bottom_right
 
End Sub
Подскажите пожалуйста, в чем может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2015, 12:47
Ответы с готовыми решениями:

Использование в VBA библиотеки, написанной на Delphi и ошибка "Out of stack space"
Использую свою dll, написаную на pascal в макросах Excel. Код VBA: Public Declare Sub test Lib...

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' ...

Маппирование памяти из user space в system space
В драйвер передается указатель из приложения, который указывает на область памяти в приложении....

Есть ли связь между STL-stack и stack - высокопроизводительная память?
Куча источников, как всегда много отсебятины, в общем я запутался...

7
Заблокирован
11.03.2015, 12:57 2
Вы не пробывали перевести ваше сообщение и понять что оно озночает ?
(Недостаточно места в памяти)
0
Заблокирован
11.03.2015, 13:15 3
Цитата Сообщение от t17fenics Посмотреть сообщение
check
Цитата Сообщение от t17fenics Посмотреть сообщение
Test1
Что означают эти загадочные буквосочетания?
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 4
11.03.2015, 13:20  [ТС] 4
Сорри, не вычистил при публикации.
Не обращайте внимание, это дополнительные процедуры. Проблема существовала с самого раннего этапа написания кода, когда этих процедур еще не было.
Там есть еще код, просто удалил его из публикации, чтоб не грузить, оставил каркас. Проблема именно в опубликованном коде, проверено 20 раз уже.
0
Заблокирован
11.03.2015, 13:24 5
Цитата Сообщение от t17fenics Посмотреть сообщение
out of stack
происходит обычно при непродуманном рекурсивном вызове процедур друг из друга, что наглядно демонстрирует ваш случай.
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 4
11.03.2015, 13:32  [ТС] 6
Хм. ошибка проявляется только после 6000 запусков этих процедур.
я так понимаю экземпляры процедуры остаются в памяти?
может быть как то можно прибить процедуру при переходе в следующую?
0
Заблокирован
11.03.2015, 13:42 7
Воспользуйтесь ключевыми словами .. is Nothing, если не иностранец..
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 4
11.03.2015, 14:23  [ТС] 8
Вобщем осознал корень проблемы. Спасибо Апострофф

Код просчитывающий движение надо как то по другому писать. без бесконечного вызова процедур друг из друга.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2015, 14:23

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

error C2440: 'return' : cannot convert from 'stack<X>' to 'stack<X> *'
Пишу класс PersonKeeper, в нем readPersons(должен считывать информацию о людях из входного потока...

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun"
Не могу понять почему значение ChoiceOfPlayer меняется и почему NumberOfRow и NumberOfColumn всегда...

Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );
добрый день. вопрос в коде: http://rextester.com/VCVVML6656 #include &lt;iostream&gt; #include...

Space Invaders
По заданию нужно написать space invaders( игру) на тасме. Сделано почти все, осталось лишь самое...

[3D] Space Warrior
Название: Space Warrior Жанр: ARCADE, RACING, SHOOTER ОС: Windows, Linux Движок: Unity Цена:...

Not enough space in Runtime area
Помогите пожалуйста! При запуске выкидывает надпись Checking NVRAM.. Not enough space in...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.