Необработанное исключение по адресу ... Переполнение стека

После компиляции программы возникает следующая ошибка:

Необработанное исключение по адресу 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 шт):

Автор решения: Qwertiy

Ну если параметры никогда не меняются, то и рекурсия никогда не закончится. А вот стек закончится - от ты и получаешь переполнение стека.

→ Ссылка
Автор решения: Harry

Раз уж вы предпочитаете глобальные переменные - то хотя бы так:

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;
}
→ Ссылка