Форум программистов, компьютерный форум, киберфорум
Наши страницы

VBA

Войти
Регистрация
Восстановить пароль
 
AndreA SN
995 / 44 / 3
Регистрация: 26.08.2011
Сообщений: 623
Записей в блоге: 2
#1

Как бороться с переполнением стека - VBA

05.06.2015, 11:08. Просмотров 669. Ответов 7
Метки нет (Все метки)

Мне нужно понять как бороться с переполнением стека.
Есть управляющая процедура. изначально она заточена под предоставление пользователю выбора. но сегодня я сообразил как в части ситуаций выбор сделать автоматически. В этом случае естественно CommandButton_Click выполняется программно. И тут возникла проблема переполнения стека. Вещь неприятная при абсолютно корректной автоматизированной работе программы...
Мне достаточно рекомендаций общего характера. Частную логику постараюсь додумать. Результаты изложу здесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2015, 11:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как бороться с переполнением стека (VBA):

Как бороться с ошибкой -2147418113? - VBA
Ошибка возникает время от времени. Файл большой. Рабочая форма содержит много элементов, расположенных на 7 страницах multipage. ...

"Затормаживание" EXCEL. Как бороться? - VBA
Добрый день. Вопрос не совсем по VBA, но думаю каждый стьалкивался с подобным. Дело в том что в моей базе данных (которую я веду в excel и...

Outlook как бороться с диалоговым окном - VBA
Проблема такая, написал макрос Outlook 2002 - который анализирует входящую почту и отправляет всем в ответ кой какой текст. При вызове...

Как бороться с утечками памяти в VBA? - VBA
Этот вопрос возник в другой теме. Но он важен сам по себе. Я не спец. И много здесь "неспецов". Но есть СПЕЦЫ. И на вас, братки, уповаем....

Как бороться с постоянно растущим размером XLS файла и размножением EMF файлов - VBA
Есть Excel'ский файл в который закачиваются данные из DBF файлов. И есть не очень , но все-же неприятные моменты : 1) С течением времени...

Как бороться с увеличением объема потребляемой оперативной памяти при сохранении файла Excel без закрытия? - VBA
Привет Всем! Вопрос такой, в программе написанной на VBA Ecxel я заметил такую штуку, при каждом сохранении без закрытия файла в ДиспЗадач...

7
SoftIce
10192 / 3693 / 955
Регистрация: 27.07.2011
Сообщений: 8,862
Завершенные тесты: 1
05.06.2015, 11:14 #2
Не допускать переполнения стека.
0
AndreA SN
995 / 44 / 3
Регистрация: 26.08.2011
Сообщений: 623
Записей в блоге: 2
05.06.2015, 11:37  [ТС] #3
проанализировал код - оказалось выход не добавил один... Вопрос снимается как таковой. Но вообще обсуждение этой проблемы и систематику причин считаю актуальными.

Добавлено через 1 минуту
Это понятно... Но недопуск переполнения стека - есть производное от организации взаимодействия функций. В случае множественной рекурсии - вопрос сложный...
0
Казанский
13219 / 5110 / 1230
Регистрация: 24.09.2011
Сообщений: 7,890
05.06.2015, 15:37 #4
Цитата Сообщение от AndreA SN Посмотреть сообщение
Мне достаточно рекомендаций общего характера
Ctrl+L (Call Stack) в режиме останова может помочь.
1
ikki
призрак
2819 / 875 / 116
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
05.06.2015, 15:55 #5
http://am.rusimport.ru/msaccess/topic.aspx?ID=266
1
AndreA SN
995 / 44 / 3
Регистрация: 26.08.2011
Сообщений: 623
Записей в блоге: 2
06.06.2015, 16:14  [ТС] #6
Спасибо, особенно за ссылочку.
кстати - моё предположение, что проблема решена всё-таки оказалось неверным.
Немного объясню ситуацию.
Есть ряд функций, которые последовательно вызывают одна другую. Пятая функция вызывает первую, но сама оказывается не завершена, как незавершенными оказываются и предыдущие четыре.
Это чистый пример косвенной рекурсии. При малых объемах вычислений - проблем нет.
При больших - рано или поздно наступает момент переполнения стека. Паршивость ситуации заключается в том, что всем процессом управляет проверка на необходимость делать следующий цикл вычислений. Если такой необходимости нет - прога выходит из всех циклов вычислений. Если есть - создает следующий рекурсивный "виток".
(Вот это "есть" часто, а в моем случае всегда, превосходит возможности стека...)
Отсюда причиной возникновения "рекурсивной спирали" является ПРОВЕРКА, которая проводится ВНУТРИ СПИРАЛИ, но УПРАВЛЯЕТ СПИРАЛЬЮ.
Получается, что независимо от типа рекурсии нужно управляющий рекурсивным процессом элемент вынести за пределы этого процесса. Иначе старый процесс не успел завершиться, а проверка запустила новый.
То есть проверка на продолжение рекурсии должна быть в головной функции, запускающей функцию, которая запускает рекурсию. Внутри рекурсивного кольца функций проверки на продолжение рекурсии быть не должно.

Отсюда эта проблема не решается "дописыванием кода внутри системы". она должна быть решена на управляющем уровне. Моя ошибка состоит как раз в этом - я создал проверку внутри пяти функций. А надо - снаружи, в "нулевой" функции. Тогда вообще не должно возникнуть рекурсии.

Если было нудно читать - я полностью соглашусь с этим. Но в определенной ситуации вдруг начинаешь понимать, что специальная теория пасует перед простыми рассуждениями на тему...
буду рад обсуждению

Добавлено через 59 минут
После этих рассуждалочек впервые глянул на функции запуска с точки зрения управляющих процессом. Я им не уделял много внимания из-за унификации всего действия. А тут - прям в другом свете всё предстало передо мной. В стеке находится всего одна функция - запускающая весь процесс и проверяющая - а надо еще раз запускать?

Редкий случай, когда "потрындеть" и "сэкономить время" оказалось одним и тем же)))
0
ikki
призрак
2819 / 875 / 116
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.06.2015, 16:17 #7
редкий случай - когда сам спросил и сам ответил
1
AndreA SN
995 / 44 / 3
Регистрация: 26.08.2011
Сообщений: 623
Записей в блоге: 2
06.06.2015, 17:03  [ТС] #8
ikki, согласен))) Ночь даром не прошла)))
Вот только думаю,что это всего лишь частный случай проблемы переполнения стека из-за рекурсий...
Вообще последнее время замечаю, что лихорадочный кодинг - не решает проблему вовсе, либо создает гиперпроблему после)))
0
06.06.2015, 17:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2015, 17:03
Привет! Вот еще темы с ответами:

Как бороться с глюком "в данной книге невозможно использование других шрифтов"? - VBA
Проблема. У меня достаточно большой и важный файл с большим кол-вом ссылок. С некоторых пор он периодически отказывается изменять,...

Как увеличить размера стека в VBA? - VBA
При создании массива 20000000 на 3 типа Long выскакивает ошибка "out of memory". Помимо улучшения компа, как еще можно ее решить. Я хочу...

Как бороться "Application-defined or object-defined error"? - VBA
Если у ячейки есть имя, то свойство Range('A1').Name определено, а если имя не задано, то Range('A1').Name возвращает <Application-defined...

Как бороться с переполнением стека - Turbo Pascal
Доброго времени суток! Помогите, пожалуйста, с программой! В паскале происходит переполнение стека, т.к. размер массива 100000000...


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

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

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