【问题标题】:Subtracting and getting seconds as input in C减去并获得秒作为 C 中的输入
【发布时间】:2021-03-17 11:39:28
【问题描述】:

我有以下代码:

#include <stdio.h>
#include <time.h>

int main(){
    clock_t timerS;
    int i=1, targetTime=2;
    scanf("%d", &targetTime);
    while(i!=0){
        timerS = clock();
        while ((double)((clock() - timerS) / CLOCKS_PER_SEC) < targetTime){
            //do something
        }
        //do another thing but delayed by the given time
        if(targetTime>=0.5)
            targetTime-=0.02;
        else i=0;
    }
    return 0;
}

我想要做的是有一个循环,它在(最初)输入的秒数内做某事,并在 targetTime-seconds 过去后做另一件事。

但在第一个循环之后,要更改执行这些操作的速度(在这种情况下更具体地说是 -0.02 秒)。

一个例子是在 2 秒内从用户那里获取多个用户输入,然后显示在这 2 秒内所做的所有输入。

第一个问题

如果初始给定时间小于 1 秒(例如 0.6),则另一件事不会延迟 0.6 秒,而是立即完成。

第二个问题

实际上与第一个类似,如果我从 targetTime 中减去 0.02 秒(在这种情况下),它会立即再次执行另一件事,而不是像我想要的那样在 targetTime-0.02 秒内执行。

我对@9​​87654324@ 中的“时钟”和“时间”主题不熟悉,所以我想我在如何完成这些操作方面做错了。另外,请不要因为上述原因给出过于复杂的解释/解决方案。

谢谢!

【问题讨论】:

    标签: c windows time clock


    【解决方案1】:

    我错误地将 targetTime 设置为 int 而不是 double。将其更改为 double 可以轻松解决问题。对不起!

    【讨论】:

      【解决方案2】:

      不要使用 clock(2) 系统调用,因为它已经过时并且已被机器独立的替换完全取代。

      如果您的系统支持,您可以使用clock_gettime(2),这将为您提供高达纳秒级的精度(取决于平台,但至少在英特尔架构上的 linux 中几乎可以保证),或者,如果您不能使用它,至少你会有gettimeofday(2),它源自BSD系统,并为你提供了一个微秒分辨率的时钟。

      如果你想停止你的程序有一些延迟,你也有sleep(2)(基于秒)usleep(2)(基于微秒)甚至nsleep(2)(基于纳秒)

      无论如何,这些调用中的任何一个都有一个不基于系统心跳的tick,并且分辨率是统一的,不依赖于系统。

      【讨论】:

      • 我确实知道 Sleep() (我使用的是 Windows)等,但主要问题是我不能让程序做 //other 事情逐渐更快。考虑一个类似 Zuma 的游戏,允许用户进行多次输入,但每 2 秒后屏幕上必须出现一个新球。我想让每个循环的这 2 秒越来越小,以便 a 球在 1.98 秒后出现,然后在 1.96 秒后出现,依此类推。
      • 但是clock() 不是windows 调用……恐怕你明白了,因为windows api 模拟了时钟调用……但它首先是在unix 中实现的。那么为什么不使用windows api时间函数呢?我确信有一套完整的系统调用来管理 windows 中的时间(然后,windows 直到最近才看到对时钟分辨率低于 10 毫秒的兴趣,我害怕)请参阅this link 以了解 Windows 本机调用时间管理。同样,不要使用clock()(更多在 Windows 中)
      • 说我是用windows作为参考,没有任何意义。
      • 好吧,那么,如果您希望您的代码可移植(而不是绑定到 Windows),那么您最好使用类似 unix 的系统调用(主要是 gettimeofday 是最常见的传播)和不要使用clock(),这是一个依赖于 AT&T unix 的系统调用,需要定义 HZ(处理每秒滴答数的常量)。
      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多