【问题标题】:Not getting proper time duration in C在 C 中没有得到适当的持续时间
【发布时间】:2020-04-03 17:12:22
【问题描述】:

让我们考虑一个像铁人三项这样的多项运动赛事。在这种情况下,当一个人完成一项活动(跑步、游泳、骑自行车等)后,他们会立即开始一项新活动。假设我有一个设备可以持续监控人的活动。如果您看到代码,在“main()”函数中,易失性变量“activity”从设备获取输入。 比赛于 2 小时前开始。

我的目标是找出该人从多长时间到当前时刻处于该特定活动中。假设从过去 1000 秒开始,这个人正在进行跑步活动,而之前他/她正在“骑自行车”(这在一般情况下可能是任何事情)。还有就是,前一个activity的结束时间就是当前activity的开始时间。

“triathlonTim()”函数每 1 秒连续调用一次。当我根据我的代码计算时间时,结果是 1 秒,但实际上应该是 1000 秒。这里,time(NULL) 和“stateTim”不断更新。 “StateTim”变量只能在人停止一项活动并开始另一项活动时更新。那么我该如何解决呢?任何其他想法或提示也对我有用。

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

#define CYCLING 1
#define RUNNING 2
#define SWIMMING 3 

static int state ;
static int prevState ;
int stateTim;

void triathlonTim(int activity)
{
    int activtyTimDur ;

    if(activity == 10)  
    {
        printf("doing Cycling\n\r");
        state = CYCLING;
    }
    else if(activity == 20) 
    {
        printf("doing Running\n\r");
        state = RUNNING;
    }
    else if(activity == 30)
    {
        printf("doing Swimming\n\r");
        state = SWIMMING;
    }

    if(prevState != state)
    {
        activtyTimDur = time(NULL) - stateTim;
        stateTim =time(NULL);
        printf("Activity Time Duration = %d\n\r", activtyTimDur);
    }
}

int main(void) 
{
    volatile int activity;
    while(1)
    {
        triathlonTim(activity);
        sleep(1);
    }
    return 0;
}

【问题讨论】:

  • 你在做sleep(1),那为什么要等1000秒呢?
  • main中的Activity没有初始化,是按值传递给函数的。它被标记为 volatile 的事实是无关紧要的。您应该假设 volatile 与您无关,直到您足够了解何时需要它。如果有帮助的话,我已经用 C 语言编程了 30 多年,还没有在我自己的代码中使用 volatile。你需要重新考虑。
  • 在“main()”函数中,易失性变量“activity”从设备获取输入我在代码中没有看到。
  • @Barmar 主要函数由另一个函数调用,该函数具有该人正在执行的当前活动。表示活动变量正在从外部(在主函数之外)获取值
  • @ThomasJager 他不希望它休眠 1000 秒,他只是希望状态更改之间的时间为 1000 秒。

标签: c


【解决方案1】:

您需要在状态发生变化时设置prevState。否则,每次调用都将被视为状态更改。

    if(prevState != state)
    {
        activtyTimDur = time(NULL) - stateTim;
        stateTim =time(NULL);
        prevState = state;
        printf("Activity Time Duration = %d\n\r", activtyTimDur);
    }

【讨论】:

  • 但是当我有像 CYCLING -> RUNNING-> CYCLING-> RUNNING-> SWIMMING 这样的活动顺序时,这种情况会失败
  • 为什么顺序很重要?它只会记住您更改活动的任何时间。
  • @Barmer 好的,是的,你是对的。但我认为除非完成,否则我可能无法找出当前正在进行的活动持续时间。因为当我处于当前事件 prevState =state 时,持续时间无法打印
  • 您只打印状态变化时的持续时间。
  • 如果他们循环 1 分钟,然后运行 ​​5 分钟,然后再次循环,它应该打印 Duration = 60 然后 Duration = 300
猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多