【问题标题】:Calling main function from another function in C从C中的另一个函数调用主函数
【发布时间】:2014-10-02 13:02:16
【问题描述】:

我有一个 main 函数,它在初始化期间运行一些函数,然后运行一个等待来自 UART 的命令的 while 循环。

当我看到一个特定的命令(比如重置)时,我会调用一个返回值的函数。我想做以下事情:

  1. 保存返回值
  2. 使用返回值再次启动主函数。 main函数初始化时需要返回值。

我是 C 语言的新手,我无法找到一种在 main 中保存变量值的方法。

【问题讨论】:

  • 您很可能必须将值写入文件(或非易失性存储器)并重置处理器。当 main 启动时,它可以从这个内存位置读取以获取值。
  • 什么平台?嵌入式演示板?您可以访问外部非易失性存储器吗?你能对微控制器非易失性存储器进行分区吗?

标签: c function call main


【解决方案1】:

理论上这是可能的,但它有点打破范式,重复调用一个函数而不让它完成并返回将很快填满你的调用堆栈,除非你采取措施在编译器背后展开它。

更常见的解决方案是将您的 main() 函数编写为一个巨大的无限 while {1} 循环。您可以在内部循环或其他方式中完成所有操作,并设置子句,如果您获得所需的新值,您可以跌至底部并返回,有效地重新运行 以新状态为主。

【讨论】:

  • 不,这是不可能的——标准禁止递归调用main
  • @ikh 这不是真的。试试看,你会看到的。但我承认这样做是不明智,无限的、无补偿的递归会使堆栈崩溃。我们都提出了相同的替代方案。
  • +1 这是更好的解决方案。您的嵌套循环想法的示例将是一个很好的补充。
  • @ChrisStratton 哦,对不起……在 C 语言中,这不是被禁止的。我只是感到困惑,因为这是被禁止的,并且会导致 C++ 中未定义的行为。
【解决方案2】:

按照我的理解,你基本上有以下设置:

int main(int argc, char *argv[]) {
    int value = something_from_last_reset;
    perform_initialization(value);
    while(1) {
        int next_command = wait_for_command();
        if(next_command == RESET_COMMAND) {
            value = get_value();
            // somehow restart main() with this new value
        }
    }
    return 0;
}

这是您可以采取的一种方法:

// global
int value = some_initial_value;

void event_loop() {
    while(1) {
        int next_command = wait_for_command();
        if(next_command == RESET_COMMAND) {
            value = get_value();
            return; // break out of the function call
        }
    }
}

int main(int argc, char *argv[]) {
    while(1) {
        perform_initialization(value);
        event_loop();
    }
    return 0;
}

这实质上可以让您“逃离”事件循环并重新执行初始化。

【讨论】:

    【解决方案3】:

    只需将您的 main 包装到无限循环中。

    int main(void)
    {
        int init_val = 0;
        while (1)
        {
            // your code ...
            init_val = some_function();
        }
    }
    

    【讨论】:

    • OP如何重置处理器(或重启main)并使用新的init_val设置系统?
    • @FiddlingBits 重置处理器是您的想法,而不是问题的一部分。这实际上是标准解决方案。从功能上讲,它与您在演示文稿中的“goto”唯一清洁器相同。
    • 这不是一个解决方案,因为这就是 OP 提到他要做的事情。他需要从头开始重新启动系统。
    • @FiddlingBits 我不认为问题是如何做到这一点。问题是,当您拥有诸如 while 循环之类的资源以及在函数中分离代码的能力时,为什么会有人想要这样做。当有这么多选择时,OP 显然在这种无意义的方法选择中具有隧道视野。
    • @FiddlingBits initing、main-code、deiniting 在while(1) 循环中——我肯定评论// your code...
    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多