2013-08-13 2 views
0

Прежде чем ответить мне, я изучаю C++ в настоящее время и имею только некоторые знания о C++.Перенаправление на функцию из функции

Вот пример, пользователь увидит выбор языка, и пользователь должен ввести номера слева от языков, чтобы выбрать его, иначе он снова вернется к выбору.

Так у меня есть идея: поместить функцию главного на первом и языке функцию в прошлом. Но проблема в том, что основная функция находится перед языка функции, поэтому основной функция не может найти язык функцию и завершить программу (Конечно, из-за этой проблемы, я не могу скомпилировать источник . код)

Вот пример кода:

int main() { 
    language();      // The main function redirect user to the language function 
} 

int language() {     // The language() function 
    std::cout << "1 for cookie!";   
    std::cin >> choice;    // Ask user for choice 
    if (choice == 1) { 
     choice1();     // If the choice is 1, user will be redirected to choice1() function 
    } else { 
     main()      // Otherwise user will be redirected to main and of course, redirect to language() function again 
    } 
} 

из-за описанной выше проблемы, я получил предупреждение от Code :: Blocks IDE при перестроен проекта:

error: 'language' was not declared in this scope

Есть ли другие способы перенаправления пользователя на другую функцию из функции?

EDIT: Текущие ответы привели меня к бесконечной петле, и это не результат, который я хочу видеть. Результат, который я хочу увидеть, - это если пользователь напечатал недопустимое значение, он перенаправит пользователя на функцию, которую пользователь в данный момент снова набирает, и код должен быть запущен только один раз. (Значит, не бесконечный цикл)

+3

Вы * действительно * вызываете 'main()' внутри другой функции? –

+4

Вы не должны вызывать 'main' внутри программы на C++. – jrok

+0

@MarcClaesen Да, * но только когда пользователь вводит что-либо, кроме 1 * – ngbeslhang

ответ

1

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

int input; 
std::cin << input; 

switch(input) { 
    case '1': 
     // do something... 
     break; 
    default: 
     break; 
} 

while (input != '1') { 
    std::cin << input; 

    switch(input) { 
     case '1': 
      // do something... 
      break; 
     default: 
      break; 
    } 
} 

Я написал код, который снова отобразить меню после нескольких попыток, но после попытки один раз, когда я удалил код и не может сделать это снова. Приведенный выше код аналогичен тому, что не учитывает, сколько раз пользователь пытался, но поскольку моя цель - просто перенаправить пользователя, когда пользователь ввел действительное значение и не приведет к тому, что программа попадет в бесконечный цикл, приведенный выше код просто отлично работает. (Я использую мобильный, поэтому не знаю, правильно ли работает код выше.)

5

Вам необходимо объявить функцию перед первым использованием.

Кроме того, как уже отмечалось, в соответствии со стандартом, вы не должны использовать основной в программе:

The function main shall not be used within a program.

Таким образом, создать еще одну функцию и инкапсулировать текущую работу внутри него!

int language(); // DECLARATION 

// You could also just define function before first usage: 
void do_work() 
{ 
    language(); 
} 


int main() { 
    do_work();      // The main function redirect user to the language function 
} 

int language() {     // The language() function DEFINITION 
    std::cout << "1 for cookie!";   
    std::cin >> choice;    // Ask user for choice 

    // If you enter the invalid input in cin (character for example) 
    // you need to reset cin in order to allow user to enter new choice 

    std::cin.clear(); 
    // don't forget to include <limits> 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 


    if (choice == 1) { 
     choice1();     // If the choice is 1, user will be redirected to choice1() function 
    } else { 
     do_work();      // Otherwise user will be redirected to do_work and of course, redirect to language() function again 
    } 
} 

ПРИМЕЧАНИЕ: Looping (особенно потенциально бесконечна), используя рекурсию (у вас есть опосредованное один здесь: do_work -> язык -> do_work) может быть опасно! Пожалуйста, ознакомьтесь с другими ответами, чтобы получить представление о том, как решить это с помощью операторов цикла!

EDIT В случае, если вы хотите проверить всю строку, а не только первый символ, вы можете прочитать всю строку в строку, проверить, если строка имеет длину 1 (пользователь ввел только один символ), и чем вы может переключаться с помощью первого символа:

include <iostream> 
#include <limits> 
#include <cstdlib> 
#include <string> 

int language(); // DECLARATION 

// You could also just define function before first usage: 
void do_work() 
{ 
    language(); 
} 


int main() { 
    do_work();      // The main function redirect user to the language function 
} 

int language() {     // The language() function DEFINITION 
    std::string choice; 
    std::cout << "1 for cookie!"; 

    std::getline(std::cin, choice); 

    if (choice.length() == 1 && choice.at(0) == '1') { 
     choice1();     // If the choice is 1, user will be redirected to choice1() function 
    } else { 
     do_work();      // Otherwise user will be redirected to do_work and of course, redirect to language() function again 
    } 
} 
+2

Обратите внимание, что они называют основной. – jrok

+0

Спасибо, отредактируйте! –

+0

Это все равно приведет к потенциальной бесконечной рекурсии и, следовательно, к сбою из-за стека - попробуйте ввести A в качестве входа для «выбора» ...;) –

1

Вы должны поставить прототип вашей функции перед вызовом:

int language(); // Declare the function, it is the prototype of the function here 

int main() { 
    language();      // The main function redirect user to the language function 
} 

int language() {     // The language() function 
    std::cout << "1 for cookie!";   
    std::cin >> choice;    // Ask user for choice 
    if (choice == 1) { 
     choice1();     // If the choice is 1, user will be redirected to choice1() function 
    } else { 
     // main(); // <- You cannot do this !! 
     language(); // Use recursive code 
    } 
} 

Обратите внимание, что в коде ниже:

  • Я добавил прототип функции language(); перед main.
  • Я изменил звонок на main, который запрещен стандартом и делает вашу функцию рекурсивной.
0

Вы ДЕЙСТВИТЕЛЬНО не хотите звонить main с другой функции. В C это технически разрешено, в C++ это «неопределенное поведение» и, следовательно, что-то, чего вам следует избегать.

Решение вместо того, чтобы поместить петлю вокруг вызова языка в основной:

int main() 
{ 
    int result = 0; 
    do 
    { 
     result = language(); 
    } while(result != 0); 
} 

Тогда пусть ваша language функция возвращает 0, когда пришло время, чтобы «бросить курить», и не равна нулю, когда оно должно продолжаться ,

+0

Это также работает с буквами и символами? – ngbeslhang

+0

@ngbeslhang: Почему это не должно быть? 'language()' будет возвращать значение, которое сообщает 'main', следует ли идти снова. Вы можете сделать это значение практически во всем, что хотите. – cHao

+0

@ngbeslhang: Не совсем уверен, что вы имеете в виду, но дело доходит до 'языка', чтобы делать то, что, по его мнению, является правильным с помощью ввода, и вернуть значение, чтобы сказать« мы продолжим »или« мы остановимся ». –

0

использование прототипов функций, где-то до основного, написать код, подобный этому:

void language(); 

тогда, вы можете написать код для функции в любом месте в пределах скомпилированных файлов.

0

я бы написать что-то вроде этого

do //forever 
{ 
    int choice = 0; 
    std::cout << "1 for cookie!";   
    std::cin >> choice; 
    if (choice == 1) 
    { 
     choice1(); 
     break; 
    } 
} while (true) 
0

Таким образом, я нашел решение, чтобы предотвратить бесконечные циклы, когда пользователь вводит любые виды, кроме цифр символов.

int main() { 
    language();      // The main function redirect user to the language function 
} 

void language() {     // The language() function 
    char choice; 

    std::cout << "1 for cookie!";   
    std::cin >> choice;    // Ask user for choice 
    if (choice == '1') { 
     choice1();     // If the choice is 1, user will be redirected to choice1() function 
    } else { 
     language()      // Otherwise user will be redirected to main and of course, redirect to language() function again 
    } 
} 

А также я обнаружил, что я забыл добавить любые типы для выбора, жаль об этом ...

И в если даного, я буду использовать «1» вместо , потому что, если я его не использую, программа «подумает», что это не 1 и привести пользователя к еще statment.

+0

И что произойдет, если вы наберете '2' и введите? Я думаю, что вы будете перенаправлены на 'language()' дважды. Вам нужно игнорировать все символы новой строки. –

+0

@NemanjaBoric Но я не знал, как игнорировать всех символов новой строки, согласно моему опыту. – ngbeslhang

+0

@NemanjaBoric У меня есть новое решение, см. Лучший ответ. – ngbeslhang

Смежные вопросы