首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将GNU端口的毫秒转换为timespec

将GNU端口的毫秒转换为timespec
EN

Stack Overflow用户
提问于 2013-02-22 12:48:08
回答 3查看 36.2K关注 0票数 8

我希望将毫秒转换为GNU Linux所使用的timespec结构。我也尝试过遵循相同的代码。

代码语言:javascript
复制
  timespec GetTimeSpecValue(unsigned long milisec)
  {
    struct timespec req;
    //long sec = (milisecondtime /1000);
    time_t sec = (time_t)(milisec/1000);
    req->tv_sec = sec;
    req->tv_nsec = 0;
    return req;
  }

运行此代码将给出以下错误。

预期‘=’,‘’,‘’;‘’,‘asm’或‘__attribute__’之前的‘GetTimeSpecValue’

我还在代码中包含了time.h文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-22 14:27:06

timespec结构以秒和纳秒两部分表示时间。因此,从毫秒转换的算法非常简单。1秒有一千毫秒,一毫秒有一千微秒,一微秒有一千纳秒,我们感谢是的。因此,我们首先需要将毫秒除以1000秒才能得到若干秒。例如,1500毫秒/ 1000 = 1.5秒。给定整数算术(不是浮点数),其馀部分将被删除(即1500 / 1000等于1,而不是1.5)。然后我们需要取一个表示一定小于1秒的毫秒数的余数,然后乘以一百万把它转换成纳秒。为了得到除以1000的余数,我们使用) (即1500 % 1000 is equal to 500)。例如,让我们将4321毫秒转换为秒和纳秒:

  1. 4321 (毫秒)/ 1000 =4(秒)
  2. 4321 (毫秒)% 1000 = 321 (毫秒)
  3. 321个(毫秒)* 1000000 = 321000000 (纳秒)

了解了上面的情况,剩下的唯一的事情就是编写一点C代码。有几件事你做得不对:

  1. 在C语言中,必须使用struct对结构数据类型进行前缀。例如,您不是说timespec,而是struct timespec。然而,在C++中,您不必这样做(不幸的是,在我看来)。
  2. 您不能从C中的函数返回结构,因此,您需要通过指针将结构传递到使用该结构执行某些操作的函数中。

编辑:这与(从C中的一个函数)相矛盾。

好了,说够了。下面是一个简单的C代码示例:

代码语言:javascript
复制
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

static void ms2ts(struct timespec *ts, unsigned long ms)
{
    ts->tv_sec = ms / 1000;
    ts->tv_nsec = (ms % 1000) * 1000000;
}

static void print_ts(unsigned long ms)
{
    struct timespec ts;
    ms2ts(&ts, ms);
    printf("%lu milliseconds is %ld seconds and %ld nanoseconds.\n",
           ms, ts.tv_sec, ts.tv_nsec);
}

int main()
{
    print_ts(1000);
    print_ts(2500);
    print_ts(4321);
    return EXIT_SUCCESS;
}

希望能帮上忙。祝好运!

票数 12
EN

Stack Overflow用户

发布于 2013-02-22 13:17:45

试试这个:

代码语言:javascript
复制
struct timespec GetTimeSpecValue(unsigned long millisec) {
    struct timespec req;
    req.tv_sec=  (time_t)(millisec/1000);
    req.tv_nsec = (millisec % 1000) * 1000000;
    return req;
}

我不认为struct是typedef‘’ed的,因此您需要用struct对timespec进行前缀。如果你想要精确的话,就算出纳米的第二部分。注意,req不是指针。因此,不能用‘-’>访问成员

票数 1
EN

Stack Overflow用户

发布于 2019-03-17 13:01:04

下面的代码包括Geoffrey的评论,包含了对答案的一些修改,避免了小延迟和长延迟模块化的区分:

代码语言:javascript
复制
void msec_to_timespec(unsigned long msec, struct timespec *ts)
{
    if (msec < 1000){
        ts->tv_sec = 0;
        ts->tv_nsec = msec * 1000000;
    }
    else {
        ts->tv_sec = msec / 1000;
        ts->tv_nsec = (msec - ts->tv_sec * 1000) * 1000000;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15024623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档