#c #function
#c #функция
Вопрос:
Как я могу вернуться к основной функции из другой вспомогательной функции? в программировании на C
в main() пользователя спрашивают, хочет ли он игры или калькулятор. например, если он выберет игры, он перейдет к функции игры, когда он находится в функции игры, он может выбрать, какую игру он хочет, или вернуться в главное меню, в котором показаны игры и калькулятор.
например:
//prototypes
function one
function sub_one
main() {
select the function :
games:1
calculator:2
go to ?(function games)?: ....
}
////////////////////////////
function games {
select the game :
snake:1
painter:2
want to go back? yes? main()
}
////////////////////////////
function snake {
a b .. get my work done here and i wanna goo back to games()
want to go back? yes? function games()
}
Мне удалось вернуться к предыдущим функциям, за исключением той, на которую указано в main().
Я попытался определить глобальный var и использовать его в цикле while внутри main(), чтобы изменить его из любой функции, чтобы иметь возможность вернуться из любой части моего кода.
Это кажется довольно простым, но я потерял терпение, потому что потратил весь свой день, пытаясь сделать это, и именно поэтому я ищу от вас небольшой подсказки.
Большое вам спасибо.
Комментарии:
1. в программировании на C. Я хотел бы опубликовать весь код целиком, но это сотни строк. это всего лишь концептуальный вопрос, требующий концептуального ответа, а не полного кода.
2. У меня очень большое искушение отказаться от этого 🙂 Я действительно не понимаю 🙂 Возможно, вам следует объяснить совершенно другими словами, что вы пытаетесь сделать.
3. извините, ребята. Я не сожалею о своей ошибке, не сообщив никаких подробностей. Надеюсь, теперь это понятно.. цените это!
4. @salvatore, нам всем когда-то приходилось изучать языки с нуля, и набросок программы в псевдокоде — отличный способ передать намерение. Во всяком случае, я нашел это гораздо более поучительным, чем текстовое описание.
5. Я действительно благодарен за то, что вы не опубликовали свои сотни строк кода. Обязательно проверьте следующий веб-сайт, прежде чем публиковать какой-либо код в StackOverflow: sscce.org
Ответ №1:
Вы можете вернуться к основной функции , вернувшись из функции , вызванной последней main()
. Обратите внимание, что вы не вызываете main()
, а просто возвращаетесь из своей функции в main. После выполнения последнего оператора функции следующий оператор является следующим в функции, которая его вызвала.
Я думаю, вы на самом деле хотите контролировать, какая функция выполняется, используя некоторую переменную состояния:
#include <stdio.h>
#include <stdlib.h>
enum {ff, gg, hh} state = ff;
void f();
void g();
void h();
int main(void)
{
while(1)
{
switch (state)
{
case ff:
f();
break;
case gg:
g();
break;
case hh:
h();
break;
}
}
}
void f()
{
printf("f()n");
state = hh;
}
void g()
{
printf("g()n");
exit(0);
}
void h()
{
printf("h()n");
state = gg;
}
Выходной сигнал:
$ ./foo
f()
h()
g()
Более чисто, вы могли бы переключиться с глобальной переменной состояния на локальную, вернув новое состояние в конце функций f()
, g()
и h()
.
Ответ №2:
То, как вы возвращаетесь к main
функции, зависит от того, как вы объявили свои другие функции:
- если вы объявите функцию
void function (...)
, то вы можете простоreturn
в любой момент или разрешить управление завершением функции — компилятор автоматически вернется к вызывающей функции - если вы объявляете функцию для возврата значения
int function(...)
илиchar * function(...)
затем вы должныreturn foo;
использовать свои функции — тип andfoo
‘s должен соответствовать типу возвращаемого значения функции. Вы не можете просто разрешить управление завершением функции.
Некоторые примеры:
#include <stdlib.h>
#include <stdio.h>
#define SNAKE 1
#define PAINTER 2
void play_snake() {
/* play the snake game */
return;
}
void play_painter() {
/* sistine chapel time */
return;
}
int prompt_for_choice() {
char choice[10];
puts("Please make a choice");
puts("");
puts("1 play snake");
puts("2 play painter");
fgets(choice, sizeof(choice), stdin);
return strtol(choice, NULL, 10);
}
int main(int argc, char* argv[]) {
int choice;
choice = prompt_for_choice();
if (choice == SNAKE) {
play_snake();
} else if (choice == PAINTER) {
play_painter();
} else {
printf("internal error, invalid choice %dn", choice);
exit(1);
}
exit(0);
}
Обратите внимание, что в этом нет ничего особенного main
. Это просто еще одна функция.
Я настоятельно рекомендую приобрести хорошую книгу о C. Моя любимая «первая книга» — это язык программирования C. Обязательно получите второе издание, так как в первом издании описана более ранняя версия языка. (Первое издание все еще может быть интересным для чтения, но оно не точно представляет язык C в том виде, в каком он используется сегодня.)
Комментарии:
1. Некоторые примечания: (1) Я бы предпочел
switch
каскадныеif
операторы в «реальной программе», но в Cswitch
достаточно предостережений, поэтому я не думаю, что это отличное введение в C. (2) Я бы предпочел массивы {string, указатель на функцию} жестко запрограммированным меню, но опять же, указатели на функции немного крутоваты для того, кто впервые изучает C. Попросите уточнить, если вам интересно.
Ответ №3:
В вашей основной функции просто вызовите функцию меню, которая вызывает все подменю, а когда вы находитесь в подменю, вы можете вызвать обратно функцию меню, которая находится в основной функции. Также новичок, но надеюсь, что это поможет
#include<stdio.h>
int menu();
int games();
int calculator();
int main(){//main function starts
menu();
return 0;
}
int menu(){
int choice;
printf("Select Functionn");
printf("1. Gamesn");
printf("2. Calculatorn");
printf("3. Exitn");
scanf("%d",amp;choice);
switch(choice){
case 1:
games();
break;
case 2:
calculator();
break;
case 3:
return 1;
break;
default:
printf("invalid Choicen");
return 0;
}
}
int games(){
int choice2;
printf("Select Gamen");
printf("1. Snaken");
printf("2. Paintern");
printf("3. Go back to main Menun");
scanf("%d",amp;choice2);
switch(choice2){
case 1:
printf("Call function for Snaken");
;break;
case 2:
printf("Call function for Paintern");
break;
case 3:
menu();
default:
printf("invalid Choicen");
}
return 0;
}
int calculator(){
//code goes here
}