Цикл
#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++
не знаю... нигде не встречал ничего про try-catch что бы делало цикл автоматически... да и не нужно оно как бы(for, while, goto никто же не мешает в обработчике исключений использовать)...
а применение рекурсии вместо цикла довольно распространенный приём, который бывает оправдан в некоторых случаях(хотя лучше не использовать рекурсию, если есть не рекурсивный алгоритм)
п.с. организация цикла с использованием try-catch это конечно изврат ещё тот))
{
try{
cout << i << endl;
if(i!= 0) throw (i-1);
}
catch(int i)
{
exeption_funk(i);
}
}
вот ещё вариант
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();
}
-- получим цикл управляемый отказом
у меня происходит ошибка вычисления факториала(рекурсивным методом) на 16м шаге
Думаю, в данном случае происходит переполнение 32-битовой целочисленной переменной. Факториал 15! равен 2 004 189 184. Факториал 16! уже не влезает в тип int.
Меня, как и Rad87, заинтересовало, когда возникнет переполнение стека. Слегка изменив код Norgat'а, провёл тест.
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. Честно говоря, я удивлён: почему так мало? Может кто-нибудь из знающих подсказать, где что почитать на эту тему?
Это невозможно. Синтаксически обработчик исключения расположен после оператора выброса исключения и повторно передать управление в блок try мы не можем (без goto).
Вариант с рекурсией я считаю некорректным так как для управления рекурсией нет никакой необходимости в throw-try-catch, только if.
Меня, как и Rad87, заинтересовало, когда возникнет переполнение стека. Слегка изменив код Norgat'а, провёл тест.
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МБ. Этого как правило достаточно для подавляющего числа случаев.
Пример koodeer нужно рассматривать под дизассемблером, я думаю что маркировака стекового фрейма catch-секцией дело не такое уж и бесплатное в плане нагрузки на память.