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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
30.11.2011, 16:10  [ТС]     Создать отдельный стек для функции #16
Ага. Вон оно чё. Понятно всё с вами.
Вот если есть в корзине 5 шаров пронумерованных от 0 до 4-х и мы вытаскиваем 3 раза по одному шару и записываем каждый номер на бумажку и шар назад в корзину не возвращаем, т это без возврата называется.
Nameless One, вы этого не знали? ну-ну...

Так, и если мы так проделаем несколько раз подряд и смотрим на наборы номеров каждый раз которые получились. И видим, что однажды мы вытащили три шара в таком порядке 0, 2, 3, а другой раз в порядке 0, 3, 2, и услаливаемся, что эти наборы (ну или множества, кому как угодно) равные то это называется без учёта порядка.
Nameless One, этого вы не знали?

Остаётся только догадываться, почему такой уважаемый человек позволяет себе мелкое ёрничанье.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
30.11.2011, 16:23     Создать отдельный стек для функции #17
Цитата Сообщение от kravam Посмотреть сообщение
Вот если есть в корзине 5 шаров пронумерованных от 0 до 4-х и мы вытаскиваем 3 раза по одному шару и записываем каждый номер на бумажку и шар назад в корзину не возвращаем, т это без возврата называется.
Nameless One, вы этого не знали? ну-ну...
это называется сочетаниями без повторений

Цитата Сообщение от kravam Посмотреть сообщение
Так, и если мы так проделаем несколько раз подряд и смотрим на наборы номеров каждый раз которые получились. И видим, что однажды мы вытащили три шара в таком порядке 0, 2, 3, а другой раз в порядке 0, 3, 2, и услаливаемся, что эти наборы (ну или множества, кому как угодно) равные то это называется без учёта порядка.
Nameless One, этого вы не знали?
"сочетания", в которых учитывается порядок, называются размещениями

мораль: следует пользоваться общепринятой терминологией, чтобы тебя понимали окружающие. А если такой терминологии нет, то нужно уточнять приводимые понятия, чтобы не возникало неопределенности.

Цитата Сообщение от kravam Посмотреть сообщение
Остаётся только догадываться, почему такой уважаемый человек позволяет себе мелкое ёрничанье.
остается только догадываться, почему человек, который вроде бы не первый день на форуме, позволяет себе в ответ на вполне невинный вопрос откровенное хамство. Причем по отношению к человеку, который проявил интерес к его проблеме и даже предложил вариант ее решения
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
30.11.2011, 16:44     Создать отдельный стек для функции #18
Цитата Сообщение от kravam Посмотреть сообщение
Сдаётся мне, что этот код неправильный, он что делает?
сдается мне (судя по последним уточнениям), что этот код делает как раз то, что тебе нужно
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
30.11.2011, 16:51  [ТС]     Создать отдельный стек для функции #19
гы... А вот тут, например, другие определения. И в частности расматриваемый вариант, о котором идёт речь, называется именно сочетанием и именно без возврата (ах, да, без возвращения) и именно без учёта порядка.

Но дело не в названиях, как вы понимаете. Просто вы поняли о чём речь и тот парень понял и переспрашивает. Ну, Бог вам судья.

Добавлено через 1 минуту
Цитата Сообщение от Nameless One Посмотреть сообщение
сдается мне (судя по последним уточнениям), что этот код делает как раз то, что тебе нужно
Это зависит от предназначения кода. Я пока не услышал его предназначения.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
30.11.2011, 16:58     Создать отдельный стек для функции #20
Цитата Сообщение от kravam Посмотреть сообщение
А вот тут, например, другие определения
там такие определения, а в лекциях/учебниках, по которым я учился в вузе - другие. В той же Википедии, например, именно используются именно те термины, которые привел я. Лично я, когда увидел "возврат", подумал о возврате именно в контексте программирования (т.е. возврат из функции и т.п.), и это меня порядком смутило
Цитата Сообщение от kravam Посмотреть сообщение
Это зависит от предназначения кода. Я пока не услышал его предназначения.
он делает именно то, что у тебя по ссылке описано в теореме 3. Кстати, это прекрасно видно из самого кода

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
А вот тут, например, другие определения
да, посмотри теорему 2 по твоей ссылке, там как раз и увидишь число размещений
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
30.11.2011, 17:32  [ТС]     Создать отдельный стек для функции #21
Цитата Сообщение от Nameless One Посмотреть сообщение
он делает именно то, что у тебя по ссылке описано в теореме 3.
Он спотыкается на данных c_n_k(40, 19)

Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, это прекрасно видно из самого кода
просто у меня недостаточно высокая квалификация, чтобы не спросить об этом.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
30.11.2011, 18:04     Создать отдельный стек для функции #22
Цитата Сообщение от kravam Посмотреть сообщение
Он спотыкается на данных c_n_k(40, 19)
это связано с неточностью представления чисел с плавающей точкой и погрешностями при делении. Сам алгоритм правилен. Если хочешь, создай тип данных "рациональная дробь" и используй его при делении (опционально, используй длинные числа, если хочешь работать с большими значениями), и будет тебе *абсолютная* точность. Ну или просто используй тот язык, в котором все это есть

Цитата Сообщение от kravam Посмотреть сообщение
просто у меня недостаточно высокая квалификация, чтобы не спросить об этом.
попробуй расписать сам цикл на бумажке, я думаю, все прояснится

Добавлено через 17 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
Ну или просто используй тот язык, в котором все это есть
дабы не быть голословным, вот реализация именно этого алгоритма на хацкеле:
Код
import Data.Ratio ((%))

c :: Integral a => a -> a -> Integer
c n k = round $ product $ map (\i -> (n - k + i) % i) [1..k]
вычисление http://www.cyberforum.ru/cgi-bin/latex.cgi?C^{19}_{40}:
Код
> c 40 19
131282408400
ответ можно проверить на любом онлайн-калькуляторе, например, здесь: http://integraloff.net/TepBep/cnk.php
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
30.11.2011, 18:33  [ТС]     Создать отдельный стек для функции #23
Цитата Сообщение от Nameless One Посмотреть сообщение
это связано с неточностью представления чисел с плавающей точкой и погрешностями при делении.
Именно это мне и не нравится и я знаю чё надо делать и я уже так делаю. Я использую класс VERYLONG

Но даже если бы у меня не было такого класса, я бы не стал писать такой код. Я понимаю, мои соображения никому не интересны, но всё же: да, базара нет, придираться к тому, что результат получается очень большим и как следствие, некорректным, это значит быть ниже пояса. Но надпись-то какую-никакую предупреждающую можно было вывести? Не знаю, чё автор хотел этим алгоритмом сказать. Мне кажется, это тот случай, когда этот простой, в общем-то алгорим нуждается в непростой и некрасивой обёртке. В частности, убрать КУДА ПОДАЛЬШЕ тип double и обеспечить абсолютную точность.

...Что, собсно, я и реализую. Ибо, я написал для себя подобную прогу но когда она спотыкалась на таких маленьких числах как 19 и 40, не смог этим удолетвориться, уж извините.

+++++++++++++++++++++++++++++++++++++++++++++++++

Но это ерунда всё. Не ерунда заключается в том. чо я нигде не говрил о сумме сочетаний. Рекурсия у меня применяется не в нахождении суммы, а в выводе сочетаний, например из пяти по 3 без возвращения и без учёта порядка.

C++
1
2
3
4
5
6
7
8
9
10
0   1   2
0   1   3
0   1   4
0   2   3
0   2   4
0   3   4
1   2   3
1   2   4
1   3   4
2   3   4
таки дела
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2011, 19:14     Создать отдельный стек для функции #24
Цитата Сообщение от kravam Посмотреть сообщение
Он спотыкается на данных c_n_k(40, 19)
double возвращается правильный
во всяком случае на программу

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
static int round_value(double value)
{
   double val = floor (value + 0.5); 
   printf ("%f\n", val);
   return int(val);
}
 
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;
   }
   printf ("%f\n", val); 
 
   return (unsigned)round_value (val);
}
 
int main()
{
   unsigned n = 40, k = 19;
   printf ("(%u, %u) = %u", n, k, c_n_k(n, k));
   return 0;
}
Bash
1
2
3
131282408400.000000
131282408400.000000
(40, 19) = 2147483648
131282408400 совпадает с тем, что дает
http://joemath.com/math124/Calculator/factorial.htm
http://www.calculatorpro.com/combination-calculator/

просто для int'a мантисса переполняется
а погрешности с double вообще практически нету
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
01.12.2011, 03:59     Создать отдельный стек для функции #25
Цитата Сообщение от kravam Посмотреть сообщение
а в выводе сочетаний, например из пяти по 3 без возвращения и без учёта порядка
а раньше об этом сказать нельзя было?
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
01.12.2011, 11:15  [ТС]     Создать отдельный стек для функции #26
Конечно, если бы я сказал об этом раньше это было бы хорошо. Но:
Цитата Сообщение от alex_x_x Посмотреть сообщение
я ж понимаю вот это нужно
и код

НУ если человек понимает... Ну вот, тут-то и хорошо было бы его поправить, но я не мог не оставить без внимания код. Если бы я сделал и то, и другое, разговор распараллелился бы. Ну его. Надо быть последовательным. Сперва одно, потом другое.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.12.2011, 11:37     Создать отдельный стек для функции #27
kravam, я вам сильно сочуствую, но все же вам нужен был отдельных стек для этого?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
 
int main () {
  int values[] = {1,2,3,4,5,6};
  const size_t size = sizeof(values) / sizeof(values[0]);
 
  do 
  {
     for (size_t i=0;i<size;++i)
     {
        std::cout << values[i] << ' ';
     }
     std::cout << std::endl;
  } 
  while (std::next_permutation(values,values+size));
 
  return 0;
}
http://codepad.org/8ScVK23h
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
01.12.2011, 13:00  [ТС]     Создать отдельный стек для функции #28
Нет стек мне нужен был не для этого.
И знаете, я написал для чего нужен стек:
"Рекурсия у меня применяется не в нахождении суммы, а в выводе сочетаний, например из пяти по 3 без возвращения и без учёта порядка."
Мы же видим просто количество перестановок.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Такое впечатление, что своё гоняет просто. Второй раз за тему.

Добавлено через 1 минуту
Nameless One, у меня тут не полигон для демонстрации кодов.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
01.12.2011, 13:43     Создать отдельный стек для функции #29
Цитата Сообщение от kravam Посмотреть сообщение
И знаете, я написал для чего нужен стек:
да не нужен для этого "отдельный стек"! Вот держи:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
bool next_combination (std::vector<int>& a, int k)
{
    int n = (int)a.size();
    for (int i=k-1; i>=0; --i)
    {
    if (a[i] < n-k+i)
    {
        ++a[i];
        for (int j=i+1; j<k; ++j)
        a[j] = a[j-1]+1;
        return true;
    }
    }
    
    return false;
}
 
void dump(const std::vector<int>& v, size_t k)
{
    std::copy(v.begin(), v.begin() + k, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}
 
int main()
{
    std::vector<int> ivec = {0, 1, 2, 3, 4};
 
    size_t k = 3;
 
    size_t cnt = 0;
 
    do
    {
    dump(ivec, k);
    ++cnt;
    }
    while(next_combination(ivec, k));
    
    std::cout << std::endl << "Count = " << cnt << std::endl;
    
    return 0;
}
Результат работы:
Код
0 1 2 
0 1 3 
0 1 4 
0 2 3 
0 2 4 
0 3 4 
1 2 3 
1 2 4 
1 3 4 
2 3 4 

Count = 10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2011, 13:47     Создать отдельный стек для функции
Еще ссылки по теме:

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

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

Создать стек символов - C++
Нужно создать стек для символов, функции ввода и вывода элементов стека и указывать, если введён эталонный символ. Всё то тип-топ, если...

Создать новый стек - C++ - C++
нужна помощь Даны очеpедь и стек целых чисел. Из элементов стека меньших минимального элемента очеpеди сфоpмиpовать новый стек. ...

Создать новый стек - C++
Ребята нужна помощь Даны очеpедь и стек целых чисел. Из элементов стека меньших минимального элемента очеpеди сфоpмиpовать новый...


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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.12.2011, 13:47     Создать отдельный стек для функции #30
Nameless One, не рушь его иллюзии
стек нужен, с ассемблерными вставками
Yandex
Объявления
01.12.2011, 13:47     Создать отдельный стек для функции
Ответ Создать тему
Опции темы

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