Вероятная причина "Недостаточно места в стеке" в VB6 - PullRequest
3 голосов
/ 29 марта 2012

Является ли наиболее вероятной причиной ошибки Error 28 - "Out of stack space" бесконечная или очень глубокая рекурсия, использующая слишком много стековой памяти?

Каковы другие вероятные причины?

Ответы [ 4 ]

5 голосов
/ 29 марта 2012

Ваша ошибка описана более здесь в MSDN.

Примечание: Эта статья MSDN относится к Visual Studio 2005. Но, вероятно, будет сказано, что то же самоепредельные значения для VB6.

  • Убедитесь, что процедуры не вложены слишком глубоко.
  • Убедитесь, что рекурсивные процедуры завершаются правильно.
  • Если локальным переменным требуется больше пространства локальных переменныхчем доступно, попробуйте объявить некоторые переменные на уровне модуля.Вы также можете объявить все переменные в процедуре static, поставив перед ключевым словом Property, Sub или Function значение Static.Или вы можете использовать оператор Static для объявления отдельных статических переменных в процедурах.
  • Переопределите некоторые из ваших строк фиксированной длины как строки переменной длины, поскольку строки фиксированной длины используют больше места в стеке, чем строки переменной длины.Вы также можете определить строку на уровне модуля, где она не требует места в стеке.
  • Проверьте количество вложенных вызовов функций DoEvents, используя диалоговое окно Calls для просмотра, какие процедуры активны в стеке.
  • Убедитесь, что вы не вызвали «каскад событий», вызвав событие, которое вызывает процедуру события уже в стеке.Каскад событий похож на неоконченный рекурсивный вызов процедуры, но он менее очевиден, поскольку вызов выполняется Visual Basic, а не явным вызовом в коде.Используйте диалоговое окно «Вызовы» для просмотра активных процедур в стеке.

[update]

Вы можете найти статью о Visual Studio 6 (VB6)свыше здесь .

  • У вас слишком много активных вызовов процедур Function, Sub или Property.Убедитесь, что процедуры не вложены слишком глубоко.Это особенно верно для рекурсивных процедур, то есть процедур, которые вызывают сами себя.Убедитесь, что рекурсивные процедуры завершены правильно.Используйте диалоговое окно «Вызовы» для просмотра активных процедур (в стеке).
  • Для ваших локальных переменных требуется больше места в локальной переменной, чем доступно.Попробуйте вместо этого объявить некоторые переменные на уровне модуля.Вы также можете объявить все переменные в процедуре static, поставив перед ключевым словом Property, Sub или Function значение Static.Или вы можете использовать оператор Static для объявления отдельных статических переменных внутри процедур.
  • У вас слишком много строк фиксированной длины.Доступ к строкам фиксированной длины в процедуре осуществляется быстрее, но они занимают больше места в стеке, чем строки переменной длины, поскольку сами данные строки помещаются в стек.Попробуйте переопределить некоторые из ваших строк фиксированной длины как строки переменной длины.Когда вы объявляете строки переменной длины в процедуре, в стек помещается только дескриптор строки (но не сами данные).Вы также можете определить строку на уровне модуля, где она не требует места в стеке.Переменные, объявленные на уровне модуля, по умолчанию являются открытыми, поэтому строка видна всем процедурам в модуле.
  • У вас слишком много вложенных вызовов функций DoEvents.Используйте диалоговое окно «Вызовы» для просмотра активных процедур в стеке.
  • Ваш код вызвал каскад событий.Каскад событий вызывается инициированием события, которое вызывает процедуру события, которая уже находится в стеке.Каскад событий похож на неоконченный рекурсивный вызов процедуры, но он менее очевиден, так как вызов выполняется Visual Basic, а не явным вызовом в вашем коде.Используйте диалоговое окно «Вызовы» для просмотра активных процедур (в стеке).
4 голосов
/ 13 июля 2013

У меня был случай, когда вместо:

Public Property Let EmployeeNo(ByVal vdata As String)
    mvarEmployeeNo = vdata
End Property

Я ошибся:

Public Property Let EmployeeNo(ByVal vdata As String)
    EmployeeNo = vdata
End Property
0 голосов
/ 10 июня 2015

Я знаю, что это старый вопрос, но я наткнулся на здесь, пытаясь выяснить причину этого в моем случае, и обнаружил, что это некоторые из оставшихся утверждений debug.print, которые я вызывал.Они создавались в цикле в событии FormatText сетки, которую я имел в форме, и я предполагаю, что она уничтожила все пространство стека.

0 голосов
/ 29 марта 2012

Да, это наиболее вероятная причина.

...