如何用C编写递归延迟函数



作为一次有趣的编码会议的一部分,我的朋友正在用C编写一个延迟函数,我以前不主要用C编程。然而,我想用递归编写一个函数,但还没能实现我想要的程序……这就是延迟,比如20ms。我想我在这里缺少了一些逻辑。。如何使用递归编写延迟函数。目前我的代码看起来是这样的,它需要处理毫秒到秒的范围。

    #include <stdio.h>
    #include <stdlib.h>
    void delay(unsigned long* d) {
        while(*d-- > 0){
           delay(d);
        }
    }
    int main()
    {
        unsigned long del = 200;
        delay(&del);
        return 0;
    }

总的来说,这看起来是一个非常糟糕的主意;在大多数繁忙循环延迟有意义的环境中,你真的负担不起仅仅为了延迟而消耗的堆栈。

也就是说,我认为将其面向指针是失败的,因为它在调用之间奇怪地共享值。

它应该是这样的:

void delay(unsigned long d)
{
  if(d > 0)
    delay(d - 1);
}

当然,d和实际产生的延迟之间绝对没有联系,这取决于OP没有披露的一大堆因素,我没有足够认真地对待这一点,试图获得信息。

而且while有点破坏了"这是递归的"心态。

坏,坏,坏。。。。

首先,这在实践中是不起作用的,如果你为了获得任何有价值的延迟而传入大量,你将耗尽堆栈空间,程序将出错或导致一些随机的未定义行为。

此外,你没有说明你在哪个平台上运行,但通常最好调用操作系统等待函数,这样等待的行为就不会占用当前核心,当前进程可以屈服于系统上的其他进程/线程,或者如果没有工作要做,可以在需要之前缓慢运行以节省电力。

此外,延迟环路实际上与实时性有何关系?它将在不同的硬件上以不同的速度运行,每次运行时也会根据同时运行的其他硬件而变化。为了准确地告诉你,我们需要将环路与时钟或其他硬件信号联系起来,使你能够像硬件中断或类似的方式跟踪时间。