首页 > 解决方案 > 在 C 中没有得到适当的持续时间

问题描述

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

我的目标是找出该人在该特定活动中的当前时间。假设从过去 1000 秒开始,该人正在进行跑步活动,而之前他/她正在“骑自行车”(这在一般情况下可能是任何事情)。另外,关键是先前活动的结束时间是当前活动的开始时间。

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

标签: c

解决方案


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

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

推荐阅读