【问题标题】:Run a function and check if another function is already executed using C运行一个函数并检查是否已经使用 C 执行了另一个函数
【发布时间】:2019-08-09 08:28:45
【问题描述】:

使用 C,我想基于另一个函数运行一个函数。我需要检查是否执行了特定功能。如果是,那么我希望这个函数在调用时也能执行,否则不。

我正在从文件中读取一些文本。在第一个函数中,我想阅读它们并打印它们。现在在第二个函数中,我需要一个条件,如果第一个函数被执行,那么也运行它。否则,什么都不做。

我该怎么做?

编辑

注意:这是完整的解决方案。问题得到解答后。

我的代码在这里:

#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;
}

如果问题不清楚,请告诉我。谢谢。

【问题讨论】:

  • 设置一个标志。如果设置了标志,请不要再这样做。
  • 我应该在这两个函数之外设置那个标志吗?以及如何在每个中调用它?
  • 你应该在函数之外define标志,但是set它要么在函数内部,要么在你的main()例程中调用之后功能。如if (!ReadingDone) { ReadingFunction(rf); ReadingDone = 1; } 或类似的int ReadingDone = 0; 建立在main() 开头附近。
  • 第一个函数运行,它也打印一个值。但是当我从键盘输入s 时,它不会打印任何内容。在什么情况下我应该把你上面提到的那个标志放在上面?
  • 不要像这样笨拙地使用scanf,而是坚持使用getc或其他简单的东西。还可以考虑使用 argv 而不是用户输入,这样您就可以使用相同的参数轻松地重复调用可执行文件,从而使测试更容易和更可预测。

标签: c function conditional-statements call


【解决方案1】:

上面的 cmets 已经回答了你的问题。为简单起见,代码如下所示:

static int already_run = 0;

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

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

也就是说,如果您只想让人们调用 Second_Function,但在第一次调用 Second_Function 时让 First_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_tcall_onceInitOnceExecuteOncesomething,它们将不同的 API 抽象出来以实现可移植性)。

【讨论】:

  • 我用了你的两种方法,不幸的是,它们都不起作用。请看一下我的代码,其他地方可能有错误。
  • 是的,知道了。谢谢。第二种方法现在有效。我会更新代码。
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多