Как переключаться между функциями и main() в программировании на языке Си

#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; использовать свои функции — тип and foo ‘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 операторы в «реальной программе», но в C switch достаточно предостережений, поэтому я не думаю, что это отличное введение в 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
}