При модульном коде C, есть ли в функции способ l oop для другой функции (т.е. для моего файла main () c)? - PullRequest
3 голосов
/ 28 марта 2020

Я в первом семестре в университете изучаю C программирование. Мы познакомились с модульностью нашего кода, и суть моей проблемы в том, что я создал функцию, которая предлагает пользователю продолжить или выйти из программы. Очевидно, у меня есть несколько других функций до этого, и я вызываю их в main (). Имейте в виду, что функции находятся в отдельных C файлах. Я вернусь sh к l oop назад к main (), если пользователь введет 'Y' (то есть, чтобы запустить программу с самого начала), но, учитывая мои начальные знания, мне было трудно понять, как go об этом. Буду признателен за любую помощь / руководство!

int continueOrExit() {
    char response; 
    char upperResponse;
    printf("Do you wish to continue the program? Y/N");
    scanf("%c", &response);
    upperResponse = toupper(response);

    while(upperResponse == 'Y')
        main(); // this is the bit which I struggle with

    .....
    }

Ответы [ 2 ]

5 голосов
/ 28 марта 2020

Вы не должны запускать ваш main() снова изнутри функции, уже вызванной из main(). Ну, вы могли бы; возможны рекурсивные вызовы, но вы определенно не хотите делать это в этом случае.

То, что вы хотите сделать, это для вашего continueOrExit() до вернуть true, когда пользователь решит продолжить, и поместить выбранную большую часть вашего main() тела в al oop:

do
{
    /* your code here */
} while (continueOrExit());
2 голосов
/ 28 марта 2020

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

Чтобы реализовать функциональность «начать заново», вы должны структурировать свой код с учетом этого. Например:

int exitByUserRequest()
{
    char upperResponse;
     ...
    return (upperResponse != 'Y');
}

int main()
{
    do
    {
        ...
    } while (!exitByUserRequest());
}

Здесь функция main вызывает exitByUserRequest и интерпретирует ее код выхода.

Если у вас есть несколько уровней функций между main и «спросить пользователя» продолжать ли », все они должны передать вызывающему информацию« выйти или продолжить », используя коды возврата. Поэтому вам следует избегать этой ситуации - ваш «выход или продолжить» следует вызывать непосредственно с main.

...