|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
Создать отдельный стек для функции29.11.2011, 22:26. Показов 4620. Ответов 44
Метки нет (Все метки)
необходимо. Мне надо вызывать рекурсивную функцию; при этом происходит переполнение стека, мне бы хотелось бы это контролировать.
g++ не поддерживает обработку SEH- исключений, отловить переполнение стека, как, впрочем и другие я не могу. Программа падает просто и всё. вызов рекурсивной функции в отдельном потоке с созданным и, как следствие, контролируемым стеком (билиотека pthread) рассамтриваю только в качестве ПОСЛЕДНЕГО варианта. Спасибо, кто откликнется Добавлено через 48 минут Только что в отладчике OllyDbg исполоьзовал такой приём: выделял объём памяти и вручную менял регистр ESP, чтобы он указывал на эту память и всё получалось, эта память работала как стек. Попробую такую идею замутить с аммесблерными вставками, они нужны будут для изменения ESP, если чё, отпишусь.
0
|
|
| 29.11.2011, 22:26 | |
|
Ответы с готовыми решениями:
44
Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести эталонный символ. Как создать отдельный поток для функции?
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||
| 30.11.2011, 17:32 [ТС] | |||
|
0
|
|||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||||||||
| 30.11.2011, 18:04 | ||||||||||||||
|
Добавлено через 17 минут
0
|
||||||||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 30.11.2011, 18:33 [ТС] | |||||||
|
Но даже если бы у меня не было такого класса, я бы не стал писать такой код. Я понимаю, мои соображения никому не интересны, но всё же: да, базара нет, придираться к тому, что результат получается очень большим и как следствие, некорректным, это значит быть ниже пояса. Но надпись-то какую-никакую предупреждающую можно было вывести? Не знаю, чё автор хотел этим алгоритмом сказать. Мне кажется, это тот случай, когда этот простой, в общем-то алгорим нуждается в непростой и некрасивой обёртке. В частности, убрать КУДА ПОДАЛЬШЕ тип double и обеспечить абсолютную точность. ...Что, собсно, я и реализую. Ибо, я написал для себя подобную прогу но когда она спотыкалась на таких маленьких числах как 19 и 40, не смог этим удолетвориться, уж извините. ++++++++++++++++++++++++++++++++++++++++ +++++++++ Но это ерунда всё. Не ерунда заключается в том. чо я нигде не говрил о сумме сочетаний. Рекурсия у меня применяется не в нахождении суммы, а в выводе сочетаний, например из пяти по 3 без возвращения и без учёта порядка.
0
|
|||||||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||||||||
| 30.11.2011, 19:14 | ||||||||||||
|
во всяком случае на программу
http://joemath.com/math124/Cal... torial.htm http://www.calculatorpro.com/c... alculator/ просто для int'a мантисса переполняется а погрешности с double вообще практически нету
0
|
||||||||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
| 01.12.2011, 03:59 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 01.12.2011, 11:15 [ТС] | ||
|
Конечно, если бы я сказал об этом раньше это было бы хорошо. Но:
НУ если человек понимает... Ну вот, тут-то и хорошо было бы его поправить, но я не мог не оставить без внимания код. Если бы я сделал и то, и другое, разговор распараллелился бы. Ну его. Надо быть последовательным. Сперва одно, потом другое.
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
| 01.12.2011, 11:37 | ||||||
|
kravam, я вам сильно сочуствую, но все же вам нужен был отдельных стек для этого?
0
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 01.12.2011, 13:00 [ТС] | ||
|
Нет стек мне нужен был не для этого.
И знаете, я написал для чего нужен стек:
++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++ Такое впечатление, что своё гоняет просто. Второй раз за тему. Добавлено через 1 минуту Nameless One, у меня тут не полигон для демонстрации кодов.
0
|
||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||||||
| 01.12.2011, 13:43 | ||||||||||||
1
|
||||||||||||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 01.12.2011, 13:47 | |
|
Nameless One, не рушь его иллюзии
![]() стек нужен, с ассемблерными вставками
1
|
|
| 01.12.2011, 13:58 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 01.12.2011, 15:44 [ТС] | |||||||
![]() Так и мне не нужен! Вы читайте внимателльно, вы же не читаете тему. И код мне ваш без надобности, чай у меня свой есть и мой покомпактнее будет.
++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++ Так вот, докладываю, если я вывожу сочетавния из m по n, у меня глубина рекурсии n. Считаем: каждая функция принимает пять параметров, плюс адрес возврата плюс ещё какая-нибудь херь, максимум ячеек 10, каждая занимает 4 байта, итого 40 ячеек. На одну функцию. Переполнится стек. если я буду применять рекурсию? А прикинем Предположим, ввыводим сочетания из 30 по 15 (ибо 30/2== 15, наибольшее количество вариантов). Так вот, по моим подсчётам, это займёт три года. Примерно, конечно. Я выводил эти значения на экран и перикидывал в меньшую (то есть невыгодну для меня сторону) как часто меняется одно из полей... Проверяйте, в общем Если будем брать ещё большие значения,например из 32 по 16, то это уже 30 лет Так, а глубина рекурсии составит всего 16*40= 640 байт при том, что стандартный стек 22E000 байт. То есть стандарнтый стек windows, он не то, что не переполнится. Он в ПРИНЦИПЕ не переполнется. Плюс код такой аккуратный. Ну это ладно, каждый кулик своё болото хвалит ++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++ Вопрос: а на фига тогда мне сдался этот отдельный стек? Ответ: компактный безопасный я не умею писать сразу, так вот в процессе тык скыть написания кода у меня частенько переполняется стек. Вот отдельный стек мне нужен для процесса тык скыть написания программ. Это основное. Понимаете, для отладки. А для готового кода мне отдельный стек без надобности. Я, конечно, мог это написать в первом сообщении но смысл? Тем более, челу и так всё понятно чё мне надо. Вы меня можете спросить, а чем тебя стандартный-то стек не устраивает, ведь вновь созданный точно также переполнится (хоть в процессе отладки, хоть как)? Отвечаю: переполниться-то он переполнгится, но я хочу сделать так, чтобы вывести предупреждающее сообщение. А так как у меня компилятор g++, он напрось не ловит системные исключения, то есть абсолютно. И переполнение вновь созданного стека я хотел отслеживать вручную ++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
0
|
|||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||
| 01.12.2011, 18:28 | |||
|
Также посмотри в сторону ключей -fstack-check и -fstack-protector, может что полезного нагуглишь. А твое решение с собственным стеком (ИМХО) выглядит слишком костыльно.
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 01.12.2011, 23:12 [ТС] | |||||||
|
Добавлено через 3 часа 36 минут Nameless One, а вообще извольте прояснить ситуацию с этим кодом:
0
|
|||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
| 02.12.2011, 04:19 | |
|
kravam, ограничение данного алгоритма в том, что исходный вектор должен представлять первые n натуральных чисел (с нулем), т.е. {0, 1, 2, ..., n - 1}. Но это ограничение легко обойти, если ввести дополнительный вектор. Причем изменить нужно будет только функцию dump
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 02.12.2011, 11:36 [ТС] | |
я бы обязательно предупредил, а вдруг бы я взялся его использовать?!
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 02.12.2011, 11:51 | ||
|
Добавлено через 2 минуты Как сделать чтоб не рухалась: Добавляешь счётчик глубины рекурсии. статическая переменная, которая увеличивается при входе и уменьшается при выходе из рекурсивной функции. Глубину рекурсии ты примерно знаешь, поэтому проверяешь значение счётчика и выкидываешь исключение при необходимости. 4 страницы галимотьи читать не стал, если это уже было написано - извиняюсь.
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 02.12.2011, 12:30 [ТС] | ||
|
Хотя способ, несомненно хорош ДАЖЕ В ПРОЦЕССЕ НАПИСАНИЯ ПРОГРАММЫ, но привязываться итогда придётся к верхушке стека, к регистру ESP и размеру стека. Троудоёмко довольно. ++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++ Но даже и в этом случае вот какая есть сложность (но ты не принимай на своё счёт, это ведь и моя идея, просто неозвученная): Дело в том, по каждому вызову функции этот счётчик должен увеличиваться на величину (кадр стека?), равную тому, что занимают локальные даные рекурсивной функции. Допустим, примерно я это количество найду и накину пару тройку для надёжности байт. Но если алгоритм построен так, что рекурсивная функция вызывает не только себя, а какую-нибудь другую функцию, нерекурсивную? А если ещё и вызывает по некоторому условию? А если и в цикле? Так что к сожалению этот счётчик должен увеличиваться на чёрт его знает какое значение байт.
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 02.12.2011, 12:38 | ||
|
Точное максимальное значение не обязательно. Примерную сложность алгоритма всегда можно оценить. Если навскидку у тебя глубина 20 вызовов, поставь счётчик на 1000. Или на 100. Предполагать, сколько переменные займут в стеке - бесполезно. Есть выравнивание, есть "перетусовывание" компилятором. Кое что вообще в стек не попадает. В дебаге добавляется "неизвестное" количество дополнительных данных для контроля повреждений стека. Счётчик считает глубину. Всё. +1 и -1. Я даже на "бесконечных" циклах счётчик использую иногда.
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 02.12.2011, 12:55 [ТС] | |
|
Ну ясно всё, неубедительно. Я уже говорил у меня очень низкая квалификация для некоторых вещей. В частности, я не возьмусь определять глубину стека до определённого момента ни примерно, никак. Такой момент наступает, как правило, когда прога готова.
Но при готовой проге вступают в силу другие соображения, а именно: я железно знаю, чо глубина рекурсии не превысит, например 100. То есть счётчик мне просто не нужен, я знаю, что он никогда не будет больше 100 и всё тут. Видишь, как получается: пока проги нет, хорошо бы использовать счётчик да глубину рекурсии не определить. А когда прога готова и можно определить глубину рекурсии- счётчик уже не нужен. Жизнь вообще сложная штука.
0
|
|
| 02.12.2011, 12:55 | |
|
Создать отдельный класс для пользователей Создать отдельный управляемый поток для бесконечного процесса
создать стек для с++ Функции для записи данных в отдельный файл txt Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|