Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
kravam
быдлокодер
1714 / 901 / 106
Регистрация: 04.06.2008
Сообщений: 5,588
1

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

25.11.2011, 19:50. Просмотров 1123. Ответов 5
Метки нет (Все метки)

Сабж
g++ 4.5.0
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 19:50
Ответы с готовыми решениями:

Как сделать, так чтобы i и j можно было вводить самому "i" И "j" в цикле, есть программа
#include <iostream> using namespace std; int main() {int a=0,b=0; int i=0; cout<<"Vvedite...

Нужно сделать так, чтобы при вводе числа, выводило "рублей" или "рубль"
Начал решать задачу и засох на средине, не выходить формулу написать,если не сложно,подскажите) с...

Как сделать, чтобы при отсутствии библиотеки программа писала "Библиотека отсутствует"?
C# Как сделать что-бы при отсутствии библиотеки программа писала например "библиотека отсутствует"...

"Программа завершена из-за переполнения программного стека" при работе рекурсивной функции
Здравствуйте Задание:Вычислить рекурсивно функцию вида у=COS(X)+COS(X^2)+COS(X^3)+...+COS( X^N)...

Появляется ошибка при работе программы "на ноль делить нельзя", как сделать так чтобы обойти это?
Вычислить на промежутке c шагом h значения функции у (х). procedure...

5
lemegeton
2968 / 1391 / 474
Регистрация: 29.11.2010
Сообщений: 2,761
25.11.2011, 20:51 2
Сразу огорчу, нет универсального способа. Лучше менять алгоритм.
Хотя бы потому, что размер стека задается при компиляции и не известен программе во время исполнения.
В качестве костыля, можно ограничить его вручную.
Пример.
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
#include <string>
#include <iostream>
#include <exception>
 
static char *stackBegin;
static int stackSize;
 
int getStackSize() {
  char stackPosition;
  int currentStackSize = (&stackPosition) - stackBegin;
  if (currentStackSize < 0) currentStackSize = -currentStackSize;
  return currentStackSize;
}
 
long int stackEater(long int n) {
  if (getStackSize() < stackSize) {
    int result = stackEater(n + 1);
    return result;
  } else {
    return n;
  }
}
 
int main(int argc, char *argv[]) {
  char stackTop;
  stackBegin = &stackTop;
  stackSize = 120 * 1024;
  
  std::cout << stackEater(1) << std::endl;
  return 0;
}
2
kravam
быдлокодер
1714 / 901 / 106
Регистрация: 04.06.2008
Сообщений: 5,588
25.11.2011, 21:05  [ТС] 3
А если отвлечься от размера стека и воспользоваться тем, что при его переполнении ось генерит ошибку и от неё плясать? (Ведь генерит же она какую-то ошибку!) Тогда надо как-то будет эту ошибку "перехватить", типа GetLastError
Но вот беда, я ни разу с системными ошибками не работал.
0
LosAngeles
Заблокирован
25.11.2011, 21:49 4
генерится SIGSEGV, перехватывается, как и любой другой сигнал(sigaction), только при этом не забыть назначить альтернативный стек, чтобы хэндлер мог выполниться(sigaltstack).

Добавлено через 16 минут
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
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/user.h>
 
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
 
 
static int count = 0;
 
void greedy() {
    char ch[1024 * 32];
    printf("%d\n", ++count);
    greedy();
}
 
 
int main(int argc, char *argv[]) {
    struct rlimit rlim;
    
    getrlimit(RLIMIT_STACK, &rlim);
    int x = rlim.rlim_cur / 1024 / 1024;
    printf("%d", x);
    rlim.rlim_cur *= 32;
    setrlimit(RLIMIT_STACK, &rlim);
    x = rlim.rlim_cur /1024 /1024;
    
    printf("%d", x);
    greedy();
    
    
    return 0;
}
а вот так вроде увеличивается стек. Стандартно у меня 8 метров было
1
kravam
быдлокодер
1714 / 901 / 106
Регистрация: 04.06.2008
Сообщений: 5,588
25.11.2011, 22:00  [ТС] 5
Спасибо, но я прочёл что В Windows сигналы SIGILL, SIGSEGV и SIGFPE не генерируются, а у меня Windows как раз
0
kravam
быдлокодер
1714 / 901 / 106
Регистрация: 04.06.2008
Сообщений: 5,588
11.12.2011, 20:42  [ТС] 6
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
     #include <windows.h>
      #include <stdio.h>
       
      void k ()
      {
        printf ("hello, word!\n");
        k();
      }
       
       
      LONG WINAPI TopLevelUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* except_info)
      {
        throw except_info;
      }
       
      int main ()
      {
       SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);
       
       try
       {
        k();
       }
       catch (PEXCEPTION_POINTERS except_info)
       {
        if (except_info->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW) {
         printf ("Stack overflow exception\n");
         getchar ();
        }
        else printf ("Unexpected exception!\n");
       }
       return 0;
      }
Вот так можно. Правда, это видно по запуску из консоли, да и нигде ничё не сохраняется, но главное, что диагностирутеся правильнео, как и было заявлено.
0
11.12.2011, 20:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2011, 20:42

Как в sql реализован логич.тип?Как можно в sql сделать так,чтобы были только значения "0"и"1" или "да"и"Нет"?
Хочу использовать в таблице переменные логического типа, но не нашла ничего про логический тип в...

Как сделать кнопку "Наверх", но чтобы она показывалась только при наведении курсора в правый нижний угол?
Здравствуйте, подскажите пожалуйста:read:, как сделать кнопку &quot;Наверх&quot; но чтобы она показывалась,...

Как сделать так, чтобы и при вводе "январь" выводилось все на экран?
string january = &quot;Январь&quot;, february = &quot;Февраль&quot;, march = &quot;Март&quot;; Здравствуйте, как сделать так,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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