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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
#1

Создать отдельный стек для функции - C++

29.11.2011, 22:26. Просмотров 2450. Ответов 44
Метки нет (Все метки)

необходимо. Мне надо вызывать рекурсивную функцию; при этом происходит переполнение стека, мне бы хотелось бы это контролировать.
g++ не поддерживает обработку SEH- исключений, отловить переполнение стека, как, впрочем и другие я не могу. Программа падает просто и всё.
вызов рекурсивной функции в отдельном потоке с созданным и, как следствие, контролируемым стеком (билиотека pthread) рассамтриваю только в качестве ПОСЛЕДНЕГО варианта.

Спасибо, кто откликнется

Добавлено через 48 минут
Только что в отладчике OllyDbg исполоьзовал такой приём: выделял объём памяти и вручную менял регистр ESP, чтобы он указывал на эту память и всё получалось, эта память работала как стек.
Попробую такую идею замутить с аммесблерными вставками, они нужны будут для изменения ESP, если чё, отпишусь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2011, 22:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать отдельный стек для функции (C++):

Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести эталонный символ. - C++
Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести...

Создать отдельный управляемый поток для бесконечного процесса - C++
Пишу простую визуализацию броуновского движения в С++ Builder-e рисуя кружочки на имейдже. Подскажите самый простой пример как запихнуть...

Функции для записи данных в отдельный файл txt - C++
Прошу помочь с такой проблемой:какие функции используются для записи данных,в моём случае массива данных ,в отдельный файл txt Всем...

создать стек для с++ - C++
сформировать стек не более чем из 5-ти элементов. Начиная с 6-го введенного символа головной элемент "выталкивается" из очереди и выводить...

Создать стек, для суммирования чисел - C++
Столкнулся с заданием в котором нужно создать стек при этом необходимо реализовать разбор строки для суммирования чисел. Они представляются...

при работе рекурсивной функции заканчивается стек и программа соответственно; как сделать так, чтобы она писала "стек закончился"? - C++
Сабж g++ 4.5.0

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
29.11.2011, 23:08 #2
kravam,

Ваша идея крайне опасная и в принципе некорректная! Не надо делать все через одно заднее место. Надо просто рекурсивную функцию заменить на нерекурсивную и не морочить ни себе, ни другим голову!
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
29.11.2011, 23:23  [ТС] #3
Там комбинаторика, её не заменить. Другое дело, что глубина рекурсии невысока, поэтому вряд ли стек переполнится. Но! Это "вряд ли" применимо к безошибочному коду. А если я по ошибке (а в процессе написания прог я тыщу раз ошибочно создавал бесконечную рекурсию) запущу эту рекурсивную функцию, то стек переполнится, а программа прсто рухнет и я не буду знать, что программа рухнула из-за переполнения стека. g++ с SEH вообще никак, то есть абсолютно.

Поэтому пока я прогу отлаживаю мне и нужно это как индикатор, то что идея рисковая я и сам знаю. Предложите другую.

Только не предлагайте ме заменять рекурсию чем-нибудь другим...
И чё не корректного, да?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2011, 00:39 #4
Цитата Сообщение от kravam Посмотреть сообщение
Там комбинаторика, её не заменить.
не вычисление факториалов, сочетаний, надеюсь?

Цитата Сообщение от kravam Посмотреть сообщение
ESP, чтобы он указывал на эту память и всё получалось, эта память работала как стек.
Попробую такую идею замутить с аммесблерными вставками, они нужны будут для изменения ESP, если чё, отпишусь.
вообще-то стек так и работает
вы просто рискуете его разрушить
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
30.11.2011, 01:11  [ТС] #5
Почему не сочетаний? Как раз-таки сочетаний из m по n без возврата
И завязывайте уже намёками говорить. Полуфразы-полудиалоги у вас. Я знаю как стек работает и докладаю, что если нормально программу скропать- если нормально, подчёркиваю, вы же об этом риске говорите?- риска вообще нет никакого. При штатном тык скыть стеке и то риск больший потому что прога выкинет необрабатываеющееся исключение, я говорил уже. В моём же случае предполагается в самой рекурсивной функции подсчёт памяти, которую она занимает с момента тык скыть начала цепочки и если чё просто сигнализирование: не та, дескать, память.

Другое дело, что её можно и не скропать нормально-то, можно вообще никак не скропать. Так это второй вопрос. Так-то я прочёл у вас: ты рискуешь не написать программу. Ну да, есть такое.

Короче: очень информативное сообщение у вас получилось.

Вот дядька примерно то же самое делает.
http://www.rsdn.ru/article/baseserv/stack.xml
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2011, 13:26 #6
kravam, да я просто посмеялся, что за задача, которую без отдельного стека не решить

Добавлено через 40 минут
я ж понимаю вот это нужно

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <math.h>
#include <stdio.h>
 
static int round_value(double value)
{
   return (int)floor (value + 0.5); 
}
 
unsigned c_n_k (unsigned n, unsigned k)
{
   double val = 1.;
   unsigned i;
 
   for (i=1;i<=k;++i)
   {
      val *= 1. * (n - k + i) / i;
   }
 
   return (unsigned)round_value (val);
}
 
int main()
{
   unsigned n = 12, k = 6;
   printf ("(%u, %u) = %u", n, k, c_n_k(n, k));
   return 0;
}
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
30.11.2011, 13:51 #7
Как вариант, переписать на хвостовую рекурсию (если это возможно), плюс компилировать с ключем -03, и (возможно), gcc соптимизирует хвостовые вызовы (тему не читал). Вообще, любую рекурсивную функцию можно переписать на цикл, и это будет правильно в случае С/С++ (это же вам не хацкель какой-нибудь)
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
30.11.2011, 14:16  [ТС] #8
Сдаётся мне, что этот код неправильный, он что делает?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2011, 14:22 #9
kravam, считает сочетание из n по k
на каких входных данных неправильно?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
30.11.2011, 14:23  [ТС] #10
Я там не уточнил, поэтому щас все уточнения: я так понимаю, он работает без возврата и без учёта порядка?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2011, 14:27 #11
Цитата Сообщение от kravam Посмотреть сообщение
Я там не уточнил, поэтому щас все уточнения: я так понимаю, он работает без возврата и без учёта порядка?
поточнее
здесь реализовано почленное деление множителей факториалов в числителе и знаменателе
это самый простой и довольно точный способ сосчитать сочетание
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
30.11.2011, 14:30  [ТС] #12
Не ну как поточнее? Вот поточнее: как найти число сочетаний из m по n без возврата и без учёта порядка?
А вы мне даёте "почленное деление множителей факториала"

Если это одно и тоже, так и скажете: одно и то же. Если нет, тогда этот пример не уместен.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2011, 15:22 #13
Цитата Сообщение от kravam Посмотреть сообщение
без возврата и без учёта порядка?
объясните что это значит
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
30.11.2011, 15:58  [ТС] #14
Дурака включаем?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
30.11.2011, 16:01 #15
Цитата Сообщение от kravam Посмотреть сообщение
Дурака включаем?
почему же? Мне вон тоже непонятно. Просвети нас, о Мудрейший
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 16:01
Привет! Вот еще темы с ответами:

Различные функции, для которых можно создать массив указателей на функции - C++
Придумайте не менее 3-х различных функций, для которых можно создать массив указателей на функции.

Функции в отдельный файл - C++
Всем доброго времени суток! У меня есть основной файл в нем main и парочка больших функций. Я вынес эти две функции в отдельный файл...

Перенести функции в отдельный файл - C++
Сейчас у меня всё в одном файле Source.cpp, как перенести все функции в другой файл Header.h(или какой-нибудь другой), где его создать?...

Создать стек - C++
Задание: Создать стек. Написать функцию, определяющую, есть ли заданная компонента в стеке. В программу включить меню работы с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.11.2011, 16:01
Ответ Создать тему
Опции темы

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