Запустите функцию и проверьте, если другая функция уже выполнена, используя C - PullRequest
0 голосов
/ 19 марта 2019

Используя C, я хочу запустить одну функцию на основе другой. Мне нужно проверить, выполняется ли конкретная функция. если да, то я хочу, чтобы эта функция также выполнялась при вызове, иначе нет.

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

Как я могу это сделать?

EDIT

ПРИМЕЧАНИЕ: ЭТО ПОЛНОЕ РЕШЕНИЕ. ПОСЛЕ ВОПРОСА ОТВЕТИЛ.

Мой код здесь:

#include <stdio.h>

static int already_run = 0;

void Reading_Function(FILE **rf)
{

already_run = 1;
   *rf=fopen("file.txt","r");

   if(rf==NULL)
   {
       printf("Error in file openning.");
       return 0;
   }

    char first [120];
    fscanf(*rf,"%s",first);
    printf("Value: %s", first);

}

// this is the second function

void Second_Function(FILE *rf)
{
if (already_run)
{
    char second [50];
    fscanf(rf,"%s",second);
    printf("Value: %s", second);
}
else

    return;


}

int main()
{



  char t;
  FILE *rf;
  while(scanf("%c", &t)==1)
    {
        switch(t)
        {

        case 'f' :
        Reading_Function(&rf);

        break;

        case 's' :
          Second_Function(rf);

        break;

        }
    }
    return 0;
}

Дайте мне знать, если вопрос не ясен. Благодаря.

1 Ответ

1 голос
/ 19 марта 2019

Комментарии выше уже отвечают на ваш вопрос.Просто для простоты, вот как будет выглядеть код:

static int already_run = 0;

void Reading_Function(FILE *rf) {
  already_run = 1;
  // ...
}

void Second_Function(FILE *rf) {
  if (already_run) {
    // ...
  } else {
    // ...
  }
}

Тем не менее, если вы пытаетесь сделать так, чтобы люди просто звонили Second_Function, но все в First_Function запустить при первом вызове Second_Function, лучший способ сделать это:

void Second_Function(FILE *rf) {
  static int already_run = 0;

  if (!already_run) {
    already_run = 1;

    // Initialization code goes here.  You can even split it out
    // into a second function if you want, in which case you would
    // just invoke that function here.
  }

  // ...
}

Таким образом, вам не о чем беспокоиться о глобальных переменных.

Конечнооба метода ломаются, если ваш код многопоточный;в этом случае вы должны использовать один раз (например, pthread_once_t, call_once, InitOnceExecuteOnce или что-то , котороеабстрагирует различные API для мобильности).

...