Ссылка goto из одной функции в другую - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Возник следующий вопрос: неужели имея в программе 2 функции, нельзя из одной из них методом goto перейти в другую функцию?
Листинг программы
  1. void main (void)
  2. {
  3. somefunction();
  4. gohere:
  5. printf('blah');
  6. }
  7. void newfunc(void)
  8. {
  9. ...
  10. goto gohere:
  11. }
Либо как можно обойти эту проблему?

Решение задачи: «Ссылка goto из одной функции в другую»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <setjmp.h>
  3. #include <stdlib.h>
  4.  
  5. enum error
  6. {
  7.     E_NONE,
  8.     E_ARGC,
  9.     E_OPEN,
  10.     E_READ
  11. };
  12.  
  13. static jmp_buf env_buf;
  14.  
  15. void run(int argc, char* argv[])
  16. {
  17.     FILE* file;
  18.     char buf[BUFSIZ];
  19.    
  20.     if(argc != 2)
  21.         longjmp(env_buf, E_ARGC);
  22.    
  23.     if((file = fopen(argv[1], "r")) == NULL)
  24.         longjmp(env_buf, E_OPEN);
  25.  
  26.     while(fgets(buf, BUFSIZ, file) != NULL)
  27.         fputs(buf, stdout);
  28.    
  29.     if(ferror(file))
  30.     {
  31.         fclose(file);
  32.         longjmp(env_buf, E_READ);
  33.     }
  34.  
  35.     fclose(file);
  36. }
  37.  
  38. int main(int argc, char* argv[])
  39. {
  40.     int ret = EXIT_SUCCESS;
  41.     int err;
  42.    
  43.     if((err = setjmp(env_buf)) == 0)
  44.         run(argc, argv);
  45.     else
  46.     {
  47.         ret = EXIT_FAILURE;
  48.        
  49.         switch(err)
  50.         {
  51.         case E_NONE: /* не выполнится никогда, т.к. longjmp(env_buf, 0) == longjmp(env_buf, 1) */
  52.             break;
  53.  
  54.         case E_ARGC:
  55.             fprintf(stderr, "Usage: %s FILENAME\n", argv[0]);
  56.             break;
  57.            
  58.         case E_OPEN:
  59.             fprintf(stderr, "Can't open file %s\n", argv[1]);
  60.             break;
  61.            
  62.         case E_READ:
  63.             fprintf(stderr, "Error reading file %s\n", argv[1]);
  64.             break;
  65.            
  66.         default:
  67.             fprintf(stderr, "Unknown error was signalled\n");
  68.             break;
  69.         }
  70.     }
  71.    
  72.     exit(ret);
  73. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы