Необработанное исключение по адресу ... Переполнение стека
После компиляции программы возникает следующая ошибка:
Необработанное исключение по адресу 0x00212C39 в funccii.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x00052F6C).
Код:
#include<iostream>
#include<string>
#include<functional>
using namespace std;
int cz;//Первый параметр в функции
int rt;//Второй параметр в функции
void PlusPlus(int ab, int cd)
{
if (ab < 10 || cd == 20)
{
cout << "That's ok" << endl;
cout << "Your's numbers:" << ab << " and " << cd << endl;
}
else
{
PlusPlus(cz, rt);//Я уверен что ошибка в этой строчке кода
}
}
int main()
{
setlocale(LC_ALL, "Rus");
cout << "Введите первое число:";
cin >> cz;
cout << "Введите второе число:";
cin >> rt;
PlusPlus(cz, rt);
cout << "Value of ou\t" << cz << endl;
cout << "Value of mai\t" << rt << endl;
system("pause");
return 0;
}
Логика программы должна быть такой:
Пользователь вводит 2 числа(cz и rt), далее вызывается функция PlusPlus().
Если первое число меньше 10, а второе число равняется 20, то всё хорошо и числа выводятся.
В противном случае я хотел чтобы был возврат в эту же функцию до тех пор пока пользователь не введет числа, которые подходили бы по условию.
Я знаю что это можно сделать с помощью цикла while, но у меня вопрос: Почему нельзя сделать возврат внутри els-а в эту же самую функцию?
Или если это возможно, то как это реализовать?
Ответы (3 шт):
Ну если параметры никогда не меняются, то и рекурсия никогда не закончится. А вот стек закончится - от ты и получаешь переполнение стека.
Раз уж вы предпочитаете глобальные переменные - то хотя бы так:
int cz, rt;
void PlusPlus()
{
cout << "Введите первое число:" ;
cin >> cz;
cout << "Введите второе число:" ;
cin >> rt;
if (cz < 10 || rt == 20)
{
cout << "That's ok" << endl;
cout<<"Your's numbers:" << cz << " and " << rt << endl;
return;
}
PlusPlus();
}
int main()
{
PlusPlus();
cout << "Value of ou\t" << cz << endl;
cout << "Value of mai\t" << rt << endl;
system("pause");
return 0;
}
Ошибка заключается в том, что если пользователь ввел не подходящие числа, то вы не просите его ввести новые, а проверяете на тех же. При этом каждый вызов функции PlusPlus добавляется в стек, но ни один из вызовов не завершается. По этому у вас переполняется стек и выдает ошибку.
Вот пример кода через ссылки, без глобальных перемен:
void PlusPlus(int& ab, int& cd) {
//Просим пользователя ввести числа
cout << "Введите первое число:";
cin >> ab;
cout << "Введите второе число:";
cin >> cd;
//Если числа подходят, то выводим их.
if (ab < 10 || cd == 20) {
cout << "That's ok" << endl;
cout << "Your's numbers:" << ab << " and " << cd << endl;
}
//Иначе вызываем опять эту функцию, в начале которой
//мы опять попросим пользователя ввести числа
else PlusPlus(ab, cd);
}
int main()
{
int cz, rt;
setlocale(LC_ALL, "Rus");
PlusPlus(cz, rt);
cout << "Value of ou\t" << cz << endl;
cout << "Value of mai\t" << rt << endl;
system("pause");
return 0;
}