Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418

Как проще всего узнать вложенность на стеке

11.05.2022, 09:40. Показов 1101. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я переписал рекурсивную функцию и хочу убедиться, что алгоритм не вылетет со StackOverflowException. Есть ли простой способ узнать максимальную глубину вызовов?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2022, 09:40
Ответы с готовыми решениями:

Как проще всего подключиться к Wi-Fi?
Меня интересует существование что-то вроде такого: SSID = "Имя wifi" Password = "12345678" Т.е. уже в коде я написал имя сети и...

Как проще всего нарисовать прямоугольник?
Как проще всего нарисовать прямоугольник, закрашенный символом '*', используя 2 цикла for, один из которых вложенный . Спасибо!

Как проще всего соединить 2 ноутбука?
Как проще всего соединить 2 ноутбука между собой для передачи файлов? Вот только чтобы с флешкой не носиться. Я пробовал создавать Новое...

9
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,428
11.05.2022, 10:08
Aycon, чтобы не бояться StackOverflowException надо вообще избегать рекурсии. Или в своём алгоритме ограничить глубину, но это полумера.

Цитата Сообщение от Aycon Посмотреть сообщение
Есть ли простой способ узнать максимальную глубину вызовов?
Зачем? Что это вам даст? Глубина зависит от того, как сильно ваш алгоритм расходует место выделенное под стек. Или вы спрашиваете о какой-то настройке вида "max recursive calls"?
0
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
11.05.2022, 10:47  [ТС]
Usaga, ну вот я переписал один раз функцию неправильно, оказывается она неявно ввзывала себя. Я отловил это случайно. Я могу например поставить точку останова если в стеке больше 20 фреймов после main?
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,428
11.05.2022, 10:49
Цитата Сообщение от Aycon Посмотреть сообщение
Я могу например поставить точку останова если в стеке больше 20 фреймов после main?
Нет) Вы можете получить Exception.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
11.05.2022, 11:02
Цитата Сообщение от Aycon Посмотреть сообщение
Есть ли простой способ узнать максимальную глубину вызовов?
Стек ограничен размером, а не глубиной вызовов напрямую.
Для 64-битных .NET-приложений он равен 4 Мб, для 32-битных - 1 Мб.
Конкретная глубина будет зависить от алгоритма. Обычные рекурсивные алгоритмы, если в них нет ошибки, вылетать не должны.

Добавлено через 54 секунды
Да, и размер стека можно менять при компиляции, но что-то мне подсказывает, что тут не нужно городить такие костыли
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
11.05.2022, 11:08
Лучший ответ Сообщение было отмечено Aycon как решение

Решение

Цитата Сообщение от Aycon Посмотреть сообщение
например поставить точку останова если в стеке больше 20 фреймов после main
C#
1
2
3
4
5
6
#if DEBUG
        if (new StackTrace().FrameCount > 20)
        {
            //breakpoint
        }
#endif
Но это только для для отладочных целей, или для анализа каких-то особых исключений и логирования.

Не стоит использовать это для реализации логики метода. Если уж совсем никак не отказаться от рекурсии в конкретном алгоритме и нужно контролировать максимальную вложенность, то лучше реализовать это через явную передачу параметра с уровнем вложенности.
1
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
11.05.2022, 11:11  [ТС]
Usaga, о каком исключении вы говорите? Я имею в виду поставить точку останова, чтобы прогнать алгоритм и убедиться, что в стеке не накопится больше 20 вызовов

Добавлено через 38 секунд
kotelok, спасибо большое, именно это я и искал)

Добавлено через 2 минуты
tezaurismosis, да, я знаю, благодарю. Проблема в том, что мне лень степать по алгоритму отлавливая вызовы. Это может занять много времени
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
11.05.2022, 11:11
Цитата Сообщение от Aycon Посмотреть сообщение
именно это я и искал
Теоретически, вот это вот new StackTrace().FrameCount > 20 можно вписать в параметры точки останова (правый клик в точку, 'conditions'). Однако, у меня Студия, почему-то, на таких условиях не останавливается.
0
13 / 11 / 2
Регистрация: 07.05.2015
Сообщений: 418
11.05.2022, 11:14  [ТС]
kotelok, вообще шикарно, спасибо!)

Добавлено через 1 минуту
kotelok, возможно, студия создаёт новый стектрейс каждый раз проходя через точку останова?
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
11.05.2022, 15:16
Цитата Сообщение от Aycon Посмотреть сообщение
возможно, студия создаёт новый стектрейс каждый раз проходя через точку останова
Оно и должно каждый раз новый экземпляр создавать. Но, видимо, экземпляр создаётся относительно контекста отладчика, а не относительно того метода, где установлена точка остановки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2022, 15:16
Помогаю со студенческими работами здесь

как проще и удобней всего организовать?
Приветствую! Есть игра: labwar.ru делаю на подобии её игру! Там система боя такая, опишу в кратце: Позиции 0/20, для атаки в...

Как проще всего понять массивы?
Такая проблема, учусь на первом курсе, язык C++ изучаю. Но как только дело дошло до массивов, так обучение встало. С указаниями препода за...

Как проще и эффективнее всего изучать C++?
Здравствуйте. Знающие, подскажите пожалуйста, как проще и эффективнее всего изучать C++? Вообще, по сути, C++ это улучшенный C, и C с...

Как проще всего сделать рисунок в С++?
Здравствуйте. У меня есть данные, которые я хочу представить графически, после чего закинуть их в уже созданный пользовательский интерфейс....

Как проще всего сравнивать даты?
день добрый! есть необходимость сравнения дат из бд. на данный момент формат такой - "год-месяц-день, часы:минуты". ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru