Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/121: Рейтинг темы: голосов - 121, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84

Увеличение размера стека

14.11.2015, 19:42. Показов 25981. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нет ли какой-либо команды, которая бы "приказала" программе расширить стек, чтобы она не вылетала с ошибкой? Просто я решаю одну задачу и не представляю как сделать её без рекурсии.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2015, 19:42
Ответы с готовыми решениями:

увеличение стека
народ кто знает как увеличить размер стека ? VS 2008

Увеличение размера файла
У меня есть на входе файл. Он открывается только для чтения (содержимое НЕ должно изменяться). Для дальнейшей работы необходимо, чтобы...

Увеличение максимального размера массива
Дорогие программисты, пожалуйста, помогите!)) Возможно ли увеличить максимальный размер массива??? Как я поняла он ограничен 64500...

41
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 16:06  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от bizba Посмотреть сообщение
Diplomate, а на какой строке падает программа?отладчиком не отлавливали? И можно ещё код класса для объекта a привести здесь?
На строке вызова нового build1 из текущего build1. А a это vector< vector<int> >

Добавлено через 2 часа 38 минут
Цитата Сообщение от castaway Посмотреть сообщение
Из расчёта: int == sizeof( void * ) == 4
Получаем:
Твой пример: 6 * 4 = 24 байта на функцию.
Мой пример: 2 * 4 = 8 байт на функцию.
Экономия 60% или 16 байт.
Спасибо за помощь, но я не совсем понимаю, за счёт чего тут будет экономия? Переменных вроде меньше не содаётся. К тому же, мне кажется, что этого не хватит. Я избавился от min и max и стал записывать значения сразу в t1[num], но программа всё равно не работает. Нельзя ли всё-таки как-то больше памяти выделить функциям?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 16:44
Цитата Сообщение от Diplomate Посмотреть сообщение
но я не совсем понимаю, за счёт чего тут будет экономия? Переменных вроде меньше не содаётся.
Стало на 4 локальных переменных меньше.

Твоя проблема может быть не связана с недостатком стека. Возможно где-то происходит выход за пределы массива. Бел полного кода и входных данных наверняка сказать невозможно.

Если же проблема всё-таки в размере стека, то его можно увеличить задав нужный параметр компоновщику. Синтаксис параметра зависит от компилятора.
1
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 18:42  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Стало на 4 локальных переменных меньше.
Твоя проблема может быть не связана с недостатком стека. Возможно где-то происходит выход за пределы массива. Бел полного кода и входных данных наверняка сказать невозможно.
Если же проблема всё-таки в размере стека, то его можно увеличить задав нужный параметр компоновщику. Синтаксис параметра зависит от компилятора.
Разве stack overflow не означает переполнение стека? А полный код программы вот:
Кликните здесь для просмотра всего текста
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
vector<pair<int, int> > t1(0);
vector<pair<int, int> > t2(0);
vector<vector<int> > a(0);
vector<vector<int> > b(0);
int j,n;
struct point{
    int seg, col, type, pos;
    point(int a, int b, int c, int d){
        seg = a;
        col = b;
        type = c;
        pos = d;
    }
    point(){
 
    }
};
void build1(int i){
    int c,num2;
    int num = j;
    t1[num].first = 999999;
    t1[num].second = 0;
    for (c = 0; c < (int)a[i].size(); c++){
        if (a[a[i][c]].size() != 0){
            j++;
            num2 = j;
            build1(a[i][c]);
            if (t1[num].first>t1[num2].first) t1[num].first = t1[num2].first;
            if (t1[num].second<t1[num2].second) t1[num].second = t1[num2].second;
        } 
        else{
            if (t1[num].first>a[i][c]) t1[num].first = a[i][c];
            if (t1[num].second<a[i][c]) t1[num].second = a[i][c];
        }
    }
}
void build2(int i){
    int c, num2;
    int num = j;
    t2[num].first = 999999;
    t2[num].second = 0;
    for (c = 0; c < (int)b[i].size(); c++){
        if (b[b[i][c]].size() != 0){
            j++;
            num2 = j;
            build2(b[i][c]);
            if (t2[num].first>t2[num2].first) t2[num].first = t2[num2].first;
            if (t2[num].second<t2[num2].second) t2[num].second = t2[num2].second;
        }
        else{
            if (t2[num].first>b[i][c]) t2[num].first = b[i][c];
            if (t2[num].second<b[i][c]) t2[num].second = b[i][c];
        }
    }
}
bool comp(point a, point b){
    if (a.pos == b.pos){
        if (a.col != b.col) return a.col < b.col;
        else return a.type < b.type;
    }
    else return a.pos < b.pos;
}
int main(){
    ifstream in;
    ofstream out;
    in.open("input.txt");
    out.open("output.txt");
    int m,k,i,x,y,ii;
    in >> n >> m >> k;
    t1.resize(m);
    t2.resize(k);
    a.resize(n + m);
    b.resize(n + k);
    for (i = 0; i < n; i++){
        in >> x >> y;
        a[n + x - 1].push_back(i);
        b[n + y - 1].push_back(i);
    }
    for (i = 0; i < m-1; i++){
        in >> x;
        a[n + x - 1].push_back(n + i);
    }
    for (i = 0; i < k-1; i++){
        in >> x;
        b[n + x - 1].push_back(n + i);
    }
    j = 0;
    build1(n + m - 1);
    j = 0;
    build2(n + k - 1);
    j = 0;
    vector<point> p((m+k)*2);  //вектор точек
    vector<int> nen(m);   //сколько красных концов было встречено в начале этого отрезка
    int ans = 0, nbe=0, nend=0, nbecur;  //ответ; сколько начал было встречено к данному моменту; сколько концов было встречено к данному моменту; для подсчёта тех, что правее
    for (i = 0; i < (int)t1.size(); i++){
        p[j].seg = i;
        p[j].col = 0;
        p[j].type = 0;
        p[j].pos = t1[i].first;
        j++;
        p[j].seg = i;
        p[j].col = 0;
        p[j].type = 1;
        p[j].pos = t1[i].second;
        j++;
    }
    for (i = 0; i < (int)t2.size(); i++){
        p[j].seg = t1.size()+i;
        p[j].col = 1;
        p[j].type = 0;
        p[j].pos = t2[i].first;
        j++;
        p[j].seg = t1.size()+i;
        p[j].col = 1;
        p[j].type = 1;
        p[j].pos = t2[i].second;
        j++;        
    }
    sort(p.begin(), p.end(), comp);
    for (i = 0; i < (int)p.size(); i++){
        if (p[i].col == 0){
            if (p[i].type == 0) nen[p[i].seg] = nend;
            else{
                nbecur = nbe;
                ii = i + 1;
                while (ii < (int)p.size() && p[ii].pos == p[i].pos){   //считаем, сколько начал красных отрезков лежит правее, но в той же точке
                    if (p[ii].col == 1 && p[ii].type == 0) nbecur++;
                    ii++;
                }
                ans += (nbecur - nen[p[i].seg]);
            }
        }
        else{
            if (p[i].type == 0) nbe++; 
            else nend++;
        }
    }
    out << ans;
    in.close();
    out.close();
}

Самое интересное, что переполнение стека это ещё полбеды. Построение отрезков вообще в целом занимает очень много времени. Не понимаю, почему так выходит, ведь время должно быть линейное.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 18:45
Цитата Сообщение от Diplomate Посмотреть сообщение
Разве stack overflow не означает переполнение стека?
Означает. А ты в этой теме упоминал об этом?
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 18:46  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Означает. А ты в этой теме упоминал об этом?
У меня оригинальное название темы было stack overflow, да и в главном посте я говорил именно про стек. Кстати говоря, увеличение количества памяти для стека может понизить время работы функции?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 19:47
Цитата Сообщение от Diplomate Посмотреть сообщение
да и в главном посте я говорил именно про стек.
В заглавном посте это выглядит как твоё предположение.
Честно говоря, сообщение "Stack overflow" может возникнуть и из-за переполнения массива/контейнера, а не и-за переполнения стека.

Цитата Сообщение от Diplomate Посмотреть сообщение
Кстати говоря, увеличение количества памяти для стека может понизить время работы функции?
Не вижу причин, по которым это может произойти.

Код сейчас посмотрю...

Добавлено через 42 минуты
Diplomate, покажи содержимое файла input.txt. Если он больше одной строки, запакуй его в архив и прикрепи в тему.
1
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 20:23  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Diplomate, покажи содержимое файла input.txt. Если он больше одной строки, запакуй его в архив и прикрепи в тему.
input.rar
Вот, как пример.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 20:40
У меня нет проблем с запуском оригинальной программы (из поста №23).
Результат из файла output.txt:
Bash
1
615256
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 21:13  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
У меня нет проблем с запуском оригинальной программы (из поста №23).
Результат из файла output.txt:
Да, вот только пока она завершит свою работу, пройдут эоны. Так быть не должно. Где-то у меня был тест с переполнением стека, но что-то я не могу его найти.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 21:33
Цитата Сообщение от Diplomate Посмотреть сообщение
Да, вот только пока она завершит свою работу, пройдут эоны.
У меня она проходит за пару секунд. О каких эонах ты говоришь?
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 21:41  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
У меня она проходит за пару секунд.
Странно, у меня это длится очень долго, хотя тестирующая система утверждает, что всё в порядке. А не мог бы ты вот такой тест проверить? У меня он вылетает с ошибкой stack overflow.
input.rar
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 21:49
Цитата Сообщение от Diplomate Посмотреть сообщение
А не мог бы ты вот такой тест проверить? У меня он вылетает с ошибкой stack overflow.
Проверил. Со значением стека по умолчанию программа "падает". Когда увеличиваю размер стека до 8 Мб, программа завершается успешно, и выдаёт значение 129271750.
1
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 21:54  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Проверил. Со значением стека по умолчанию программа "падает". Когда увеличиваю размер стека до 8 Мб, программа завершается успешно, и выдаёт значение 129271750.
Судя по тестам, этот ответ неправильный. Значит, где-то в программе у меня ошибка. Спасибо за помощь, буду думать. А как увеличить размер стека, кстати говоря?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 22:07
Цитата Сообщение от Diplomate Посмотреть сообщение
А как увеличить размер стека, кстати говоря?
Я же уже говорил. Это зависит от компилятора, название которого ты до сих пор не назвал.
1
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
15.11.2015, 23:18  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Я же уже говорил. Это зависит от компилятора, название которого ты до сих пор не назвал.
Visual C++
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 23:24
Цитата Сообщение от Diplomate Посмотреть сообщение
Visual C++
Кто-нибудь, кто тесно знаком с VS, подскажите ТС как увеличить размер стека при компоновке.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2015, 00:07
Цитата Сообщение от Diplomate Посмотреть сообщение
Visual C++
https://msdn.microsoft.com/lib... .110).aspx
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
16.11.2015, 00:15
Цитата Сообщение от Diplomate Посмотреть сообщение
Не понимаю, почему так выходит, ведь время должно быть линейное.
Асимптотическая сложность - лишь один из многих факторов, влияющих на быстродействие. В данном случае сам код написан крайне неэффективно (уж не знаю как сильно это влияет на производительность, я не профайлер, но все же такой факт присутствует).

Цитата Сообщение от Diplomate Посмотреть сообщение
А как увеличить размер стека, кстати говоря?
Тебе не нужно увеличивать размер стека. Это не решение, а костыль, грязный хак, подгон. Никто его у тебя не примет. Верное решение - это решение, в котором рекурсии нет (ну или если она хвостовая - но это не твой случай). Не вижу проблем в избавлении от нее. Если у тебя тут DFS, как ты говоришь, то он элементарно реализуется без рекурсии.
2
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
20.11.2015, 12:40  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
Асимптотическая сложность - лишь один из многих факторов, влияющих на быстродействие. В данном случае сам код написан крайне неэффективно (уж не знаю как сильно это влияет на производительность, я не профайлер, но все же такой факт присутствует).
А в чём именно неэффективность? Как можно было бы сделать лучше?
Цитата Сообщение от ct0r Посмотреть сообщение
Тебе не нужно увеличивать размер стека. Это не решение, а костыль, грязный хак, подгон. Никто его у тебя не примет. Верное решение - это решение, в котором рекурсии нет (ну или если она хвостовая - но это не твой случай). Не вижу проблем в избавлении от нее. Если у тебя тут DFS, как ты говоришь, то он элементарно реализуется без рекурсии.
Выигрыша по производительности это не даст, зато знатно увеличит код. Зачем, если можно просто расширить стек?

Вообще стек уже не так важен, поскольку ошибка переполнения пропала. Надо как-то ускорить программу, а я не понимаю, как это сделать.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
20.11.2015, 14:32
Цитата Сообщение от Diplomate Посмотреть сообщение
А в чём именно неэффективность? Как можно было бы сделать лучше?
Ну так чем у меня спрашивать, лучше запусти профайлер и сам найди узкие места. Подумай, что с ними можно сделать. И вот если ничего не придумаешь - тогда уже спрашивай. Ибо в чем смысл, если я за тебя все сделаю?

Цитата Сообщение от Diplomate Посмотреть сообщение
Выигрыша по производительности это не даст, зато знатно увеличит код. Зачем, если можно просто расширить стек?
Затем, что
1) где гарантия, что не даст? у тебя С++, а не Haskell, не забывай
2) где гарантия, что не будет входных данных, при которых и нового размера стека не хватит?
3) где гарантия, что программе дадут использовать стек такого размера?
4) ты учишься или что? Сложно переписать без рекурсии - переписывай все без рекурсии, пока не врубишься, как это делается.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2015, 14:32

Динамическое увеличение размера динамического массива
Никак не могу понять как это исправить.. Помогите, пожалуйста, разобраться в чём дело: struct myPoint ...

Увеличение размера массива из элементов собственного класса
Добрый день, столкнулся с проблемой, у меня есть собственный класс myClass{ myClass(){ len = 0; ii = new...

Увеличение размера стека
Пытаюсь увеличить размер стека при помощи файла .def в основном юните пишу строку #pragma resource &quot;*.def&quot; в def файле ...

Постепенное увеличение размера дива и размера шрифта вложенного текста
Имеется див с текстом внутри. Как сделать, чтобы при загрузке страницы на экране было сначало пусто, т.е. размер дива и текста 0. Потом...

Увеличение стека!
C# Visual Studio 2008 Как увеличить размер стека. У меня в программе много рекурсивных функций. Я так понял из за того, что я...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru