Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我使用difftime的c函数有时返回65535_C - Fatal编程技术网

我使用difftime的c函数有时返回65535

我使用difftime的c函数有时返回65535,c,C,我有一个函数,它使用difftime来检测自通信心跳停止以来的时间(以秒为单位)。此函数可以每50毫秒运行一次。除了偶尔返回65535外,该函数似乎正常工作。我可以将执行时间减少到每秒一次,因为difftime的返回时间仅以秒为单位。但我不知道它是否能解决这个问题。这是因为我没有正确地将difftime返回从double返回uint16\U t造成的问题吗 这个程序在ubuntu 64位机器上运行 请帮忙。谢谢 uint16_t commlost(uint16_t heartbeat_read_

我有一个函数,它使用difftime来检测自通信心跳停止以来的时间(以秒为单位)。此函数可以每50毫秒运行一次。除了偶尔返回65535外,该函数似乎正常工作。我可以将执行时间减少到每秒一次,因为difftime的返回时间仅以秒为单位。但我不知道它是否能解决这个问题。这是因为我没有正确地将difftime返回从double返回uint16\U t造成的问题吗

这个程序在ubuntu 64位机器上运行

请帮忙。谢谢

uint16_t commlost(uint16_t heartbeat_read_cur)
{  
    time_t current_time;  
    static time_t previous_time;  
    static uint16_t commlost_secs_cur = 0;  
    static uint16_t commlost_secs_prev = 0;  
    static uint16_t heartbeat_read_prev = 0;  
    static bool first_time = TRUE;
    if (first_time)
    {
        previous_time = time(NULL);
        first_time = FALSE;
    }

    time(&current_time);

    commlost_secs_prev = commlost_secs_cur;

    if(heartbeat_read_prev == heartbeat_read_cur)
    {

        commlost_secs_cur += difftime(current_time, previous_time);
    }
    else
    {
        heartbeat_read_prev = heartbeat_read_cur;
        commlost_secs_cur = 0;
    }

    previous_time = current_time;

    return (commlost_secs_cur);
}

在查询时间之前,请阅读手册页(然后再次阅读)

例如,我建议使用
CLOCK\u MONOTONIC
CLOCK\u REALTIME
,最好使用
double
进行时间计算(因为
struct timespec
通常比任何整数类型都大)

不要将
uint16\u t
用于此类时间计算

试用

inline double double_gettime (clockid_t cid) {
  struct timespec ts = {0,0};
  clock_gettime(cid, &ts);
  return (double)ts.tv_sec + 1.0e-9*ts.tv_nsec;
}
您可能希望通过测试clock\u gettime是否出现故障,并在出现故障时给出
NAN
,使该函数更加丰富多彩!这是留给读者的练习。对于
CLOCK\u REALTIME
等,您还可以测量流程开始时的某个时间与当前时间之间的差异(即,计算差异的
struct timespec
,并将该差异转换为
双精度

然后像

double tstart = double_gettime(CLOCK_REALTIME);
some_long_computation();
double tend = double_gettime(CLOCK_REALTIME);
printf ("needed %f seconds to compute\n", tend-tstart);

另请参见

在查询时间之前,阅读手册页(然后再次阅读)

例如,我建议使用
CLOCK\u MONOTONIC
CLOCK\u REALTIME
,最好使用
double
进行时间计算(因为
struct timespec
通常比任何整数类型都大)

不要将
uint16\u t
用于此类时间计算

试用

inline double double_gettime (clockid_t cid) {
  struct timespec ts = {0,0};
  clock_gettime(cid, &ts);
  return (double)ts.tv_sec + 1.0e-9*ts.tv_nsec;
}
您可能希望通过测试clock\u gettime是否出现故障,并在出现故障时给出
NAN
,使该函数更加丰富多彩!这是留给读者的练习。对于
CLOCK\u REALTIME
等,您还可以测量流程开始时的某个时间与当前时间之间的差异(即,计算差异的
struct timespec
,并将该差异转换为
双精度

然后像

double tstart = double_gettime(CLOCK_REALTIME);
some_long_computation();
double tend = double_gettime(CLOCK_REALTIME);
printf ("needed %f seconds to compute\n", tend-tstart);
另请参见
difftime()
用于
time\t
支持时间分辨率高于整数秒的系统。虽然允许,但我从未遇到过这样的系统——我不认为存在这样的系统。特别是在POSIX系统上,
time\u t
是以整数秒为单位测量的,而
difftime()
相当于其参数的算术减法,因此实际上最好使用:

commlost_secs_cur += current_time - previous_time ;
这就是说,您的实现有点过于复杂,而不是自上次调用以来累积的时间(可能小于时钟分辨率),您可以简单地对观察到的最后一次心跳加上时间戳,然后返回此后的时间:

int commlost(uint16_t heartbeat_read_cur)
{  
    time_t current_time = time(0) ;  
    static time_t heartbeat_timestamp = 0 ; 
    static uint16_t heartbeat_read_prev  ;

    // If first time, or heartbeat changed...
    if( heartbeat_timestamp == 0 || heartbeat_read_prev != heartbeat_read_cur)
    {
        // ... timestamp heartbeat
        heartbeat_timestamp = time(0) ;

        // ... keep last heartbeat
        heartbeat_read_prev = heartbeat_read_cur ;
    }

    // Return seconds since last heartbeat timestamp
    return current_time - heartbeat_timestamp ;
}
我不知道你为什么要用
uint16\u t
来做这个;除非是为了与某些特定协议或文件格式兼容,否则几乎没有优势

difftime()
适用于
time\u t
支持时间分辨率高于整数秒的系统。虽然允许,但我从未遇到过这样的系统——我不认为存在这样的系统。特别是在POSIX系统上,
time\u t
是以整数秒为单位测量的,而
difftime()
相当于其参数的算术减法,因此实际上最好使用:

commlost_secs_cur += current_time - previous_time ;
这就是说,您的实现有点过于复杂,而不是自上次调用以来累积的时间(可能小于时钟分辨率),您可以简单地对观察到的最后一次心跳加上时间戳,然后返回此后的时间:

int commlost(uint16_t heartbeat_read_cur)
{  
    time_t current_time = time(0) ;  
    static time_t heartbeat_timestamp = 0 ; 
    static uint16_t heartbeat_read_prev  ;

    // If first time, or heartbeat changed...
    if( heartbeat_timestamp == 0 || heartbeat_read_prev != heartbeat_read_cur)
    {
        // ... timestamp heartbeat
        heartbeat_timestamp = time(0) ;

        // ... keep last heartbeat
        heartbeat_read_prev = heartbeat_read_cur ;
    }

    // Return seconds since last heartbeat timestamp
    return current_time - heartbeat_timestamp ;
}

我不知道你为什么要用
uint16\u t
来做这个;除非是为了与某些特定协议或文件格式兼容,否则几乎没有优势

这是一个奇数。。。可能是返回-1(假设返回类型是16位整数,而不是32位整数)?我会检查函数的文档。
difftime()
返回
double
。可能是
double
-->
uint16\u t
溢出了?请查看
current\u time
previous\u time
的值,以及通过使用调试器或添加
printf
调用返回的
difftime()。65535秒等于18+小时;它也是a
uint16)t
@chux的最大值:溢出是合理的,但我发现(在类似的系统上)它在65535处缠绕而不是饱和。您是否可能从多个线程调用此函数?这是一个奇数。。。可能是返回-1(假设返回类型是16位整数,而不是32位整数)?我会检查函数的文档。
difftime()
返回
double
。可能是
double
-->
uint16\u t
溢出了?请查看
current\u time
previous\u time
的值,以及通过使用调试器或添加
printf
调用返回的
difftime()。65535秒等于18+小时;这也是
uint16)t
@chux的最大值:溢出是合理的,但我发现(在类似的系统上)它在65535处缠绕而不是饱和。您是否可能从多个线程调用此函数?注意:
time
即使不是以秒为单位,也是
difftime()的结果
以秒为单位。@chux:是的,但它不必要是一个
双精度的。该问题询问问题是否存在于从
双精度转换中;我对此表示怀疑,但是