Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
AndreA SN
1001 / 104 / 2
Регистрация: 26.08.2011
Сообщений: 806
Записей в блоге: 2
#1

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

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

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

Как бороться с ошибкой -2147418113?
Ошибка возникает время от времени. Файл большой. Рабочая форма содержит много...

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

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

Как бороться с утечками памяти в VBA?
Этот вопрос возник в другой теме. Но он важен сам по себе. Я не спец. И много...

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

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

7
SoftIce
comment ca va
10412 / 3914 / 999
Регистрация: 27.07.2011
Сообщений: 9,469
Завершенные тесты: 1
05.06.2015, 11:14 #2
Не допускать переполнения стека.
0
AndreA SN
1001 / 104 / 2
Регистрация: 26.08.2011
Сообщений: 806
Записей в блоге: 2
05.06.2015, 11:37  [ТС] #3
проанализировал код - оказалось выход не добавил один... Вопрос снимается как таковой. Но вообще обсуждение этой проблемы и систематику причин считаю актуальными.

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

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

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

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

Редкий случай, когда "потрындеть" и "сэкономить время" оказалось одним и тем же)))
0
ikki
призрак
2822 / 878 / 117
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.06.2015, 16:17 #7
редкий случай - когда сам спросил и сам ответил
1
AndreA SN
1001 / 104 / 2
Регистрация: 26.08.2011
Сообщений: 806
Записей в блоге: 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?
При создании массива 20000000 на 3 типа Long выскакивает ошибка "out of...

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

Как бороться с переполнением стека
Доброго времени суток! Помогите, пожалуйста, с программой! В паскале...


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

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

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