Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Цикл

37K
24 мая 2010 года
Subaro
14 / / 07.03.2009
Задание состоит в том чтобы на С++ реализовать цикл без таких управляющих структур как: while, for, goto.. а с помощью обработки исключений. Подскажите какие знания в обработки исключений помогу мне решить эту задачу.
2.1K
24 мая 2010 года
Norgat
452 / / 12.08.2009
ну, судя по всему, нужно заюзать рекурсию в обработчике исключений

Код:
#include <iostream>
#include <conio.h>

using namespace std;

void exeption_funk(int i)
{
    try{
        cout << i << endl;
        if(i!= 0) throw (i-1);
    }
    catch(int i)
    {
        exeption_funk(i);
    }
}

void main()
{
    exeption_funk(10);
    cout << "end\n";
    _getch();
}


про try, throw и catch прочитай в любом учебнике по C++
37K
24 мая 2010 года
Subaro
14 / / 07.03.2009
Спс, про try, cath, throw читал, просто в голове не могло уложится как цикл то с помощью них делать, думал что там какие то спец ф-и отладки существуют которые помогают к началу try вернутся после того как cath его поймал.
2.1K
24 мая 2010 года
Norgat
452 / / 12.08.2009
Цитата: Subaro
Спс, про try, cath, throw читал, просто в голове не могло уложится как цикл то с помощью них делать, думал что там какие то спец ф-и отладки существуют которые помогают к началу try вернутся после того как cath его поймал.



не знаю... нигде не встречал ничего про try-catch что бы делало цикл автоматически... да и не нужно оно как бы(for, while, goto никто же не мешает в обработчике исключений использовать)...
а применение рекурсии вместо цикла довольно распространенный приём, который бывает оправдан в некоторых случаях(хотя лучше не использовать рекурсию, если есть не рекурсивный алгоритм)


п.с. организация цикла с использованием try-catch это конечно изврат ещё тот))

1.9K
26 мая 2010 года
Rad87
123 / / 14.12.2005
интересно при какой глубине проникновения рекурсии возникнет переполнения стека?
1.8K
26 мая 2010 года
LM(AL/M)
332 / / 20.12.2005
Цитата: Norgat
Код:
void exeption_funk(int i)
{
    try{
        cout << i << endl;
        if(i!= 0) throw (i-1);
    }
    catch(int i)
    {
        exeption_funk(i);
    }
}



вот ещё вариант

Код:
void loop() {
     try {
        // Begin loop
        some_recursive_fn();
     }
     catch(...)
     {
         // Finish the loop when fn throws an exception
     }
  }

  void some_recursive_fn() {
     // Do something
     ....
     // And next iteration
     some_recursive_fn();
  }

-- получим цикл управляемый отказом
2.1K
26 мая 2010 года
Norgat
452 / / 12.08.2009
Цитата: Rad87
интересно при какой глубине проникновения рекурсии возникнет переполнения стека?



у меня происходит ошибка вычисления факториала(рекурсивным методом) на 16м шаге

297
26 мая 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: Norgat
у меня происходит ошибка вычисления факториала(рекурсивным методом) на 16м шаге


Думаю, в данном случае происходит переполнение 32-битовой целочисленной переменной. Факториал 15! равен 2 004 189 184. Факториал 16! уже не влезает в тип int.

Меня, как и Rad87, заинтересовало, когда возникнет переполнение стека. Слегка изменив код Norgat'а, провёл тест.

Код:
#include<iostream>
using namespace std;
void exeption_funk(int i)
{
    try
    {
        cout << i << " ";
        throw (i + 1);
    }
    catch(int i)
    {
        exeption_funk(i);
    }
}
void main()
{
    exeption_funk(1);
}

Последнее выводимое значение - 548. Честно говоря, я удивлён: почему так мало? Может кто-нибудь из знающих подсказать, где что почитать на эту тему?
5
26 мая 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Subaro
Задание состоит в том чтобы на С++ реализовать цикл без таких управляющих структур как: while, for, goto.. а с помощью обработки исключений. Подскажите какие знания в обработки исключений помогу мне решить эту задачу.


Это невозможно. Синтаксически обработчик исключения расположен после оператора выброса исключения и повторно передать управление в блок try мы не можем (без goto).
Вариант с рекурсией я считаю некорректным так как для управления рекурсией нет никакой необходимости в throw-try-catch, только if.

1.9K
28 мая 2010 года
Rad87
123 / / 14.12.2005
Цитата: koodeer
Думаю, в данном случае происходит переполнение 32-битовой целочисленной переменной. Факториал 15! равен 2 004 189 184. Факториал 16! уже не влезает в тип int.

Меня, как и Rad87, заинтересовало, когда возникнет переполнение стека. Слегка изменив код Norgat'а, провёл тест.
Код:
#include<iostream>
using namespace std;
void exeption_funk(int i)
{
    try
    {
        cout << i << " ";
        throw (i + 1);
    }
    catch(int i)
    {
        exeption_funk(i);
    }
}
void main()
{
    exeption_funk(1);
}

Последнее выводимое значение - 548. Честно говоря, я удивлён: почему так мало? Может кто-нибудь из знающих подсказать, где что почитать на эту тему?



http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2
Если в стек кладется адрес (4 байта) и 548 итераций том получаем размер стека примерно в 2 килобайта.... может я и ошибаюсь.

1.9K
28 мая 2010 года
Rad87
123 / / 14.12.2005
Мне тут знающие люди подсказали, что размер стека можно изменить самому.
Он меняется в настройках линковщика.
5
29 мая 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Rad87
Мне тут знающие люди подсказали, что размер стека можно изменить самому.
Он меняется в настройках линковщика.


По-умолчанию стек имеет размер в 1МБ. Этого как правило достаточно для подавляющего числа случаев.
Пример koodeer нужно рассматривать под дизассемблером, я думаю что маркировака стекового фрейма catch-секцией дело не такое уж и бесплатное в плане нагрузки на память.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог