首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gettimeofday()上的奇怪邮票

gettimeofday()上的奇怪邮票
EN

Stack Overflow用户
提问于 2019-05-08 17:25:23
回答 2查看 68关注 0票数 0

我已经为我的大学的抽样作业写了这段代码。

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

int main(int argc, char **argv){
    struct timeval tv;

    float t = atoi(argv[1]);  //sampling time period in sec's
    float dt = atoi(argv[2]);   //sampling rate in msec's
    double time;
    int nsamples = t/dt * 1000; //number of samples floored

    //samples storage array
    double *samples;
    samples = malloc(nsamples);

    printf("%d\n\n",nsamples);

    int c = 0;  //array index
    double divergance;

    gettimeofday(&tv, NULL);
    time =(double) tv.tv_sec + tv.tv_usec / 1000000.0f;
    samples[c] = time;
    printf("time: %f\n", samples[c]);

    usleep(dt * 1000);

    while(c<nsamples){
      c++;

      gettimeofday(&tv, NULL);
      time = (double) tv.tv_sec + tv.tv_usec / 1000000.0f;
      samples[c] = time;

      //divergance calculated in msec's
      divergance = (samples[c] - samples[c-1]);
      if (c==9){
        printf("%f \n \n%f", samples[c-1], samples[c]);
      }
      printf("time: %f\ndivergance: %f ms\n\n", samples[c], divergance*1000);

      usleep(dt *1000);
    }

}

这是我的输出

时间: 1557335682.435666分选: 200.127125 ms 时间: 1557335682.635813分选: 200.146914 ms 时间: 1557335682.835952分选: 200.139046 ms 时间: 1557335683.036075分选: 200.123072 ms 时间: 1557335683.236192分频:-50328976507548121002151598324465532616014103321089770750300716493231241208217866953937760599346823570331739493744117764925654540012842402655523878795775819489233146901362588461216017208320541658368563434403808909221817741213696.000000 ms 时间: 1557335683.436400分选: 1557335683436.399902 ms 时间: 1557335683.636521分选: 1557335683636.520752 ms 时间: 1557335683.836647分选: 1557335683836.646973 ms

有人知道第五次计算的奇怪结果是什么吗。我无法想象任何合乎逻辑的解释,因为我以前从未遇到过类似的"bug“。它与gettimeofday()函数的某些特性有关吗?

输入是10200

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-08 17:40:33

您还没有为samples分配足够的空间

代码语言:javascript
复制
samples = malloc(nsamples);

malloc函数为指定数量的字节()分配空间,而不是为数组元素数分配空间。所以你的数组比你想的要短得多。这意味着您将最终编写完数组的末尾,调用未定义行为

您需要将元素的数量乘以元素大小,以分配正确的空间数量:

代码语言:javascript
复制
samples = malloc(nsamples * sizeof(*samples));

在访问数组时,还会出现一个错误:

代码语言:javascript
复制
int c = 0;
...
while(c<nsamples){
  c++;
  ...
  samples[c] = time;
  ...
}

这也将写入数组的末尾,特别是一个数组元素太多。

将循环更改为从值1开始,并在结尾处进行增量。

代码语言:javascript
复制
int c = 0;
...
c = 1;
while(c<nsamples){
  ...
  samples[c] = time;
  ...
  c++;
}
票数 3
EN

Stack Overflow用户

发布于 2019-05-12 11:00:41

malloc(3) mus的参数是要分配的字节数,而不是样本数。如果计划分配一个floatdouble示例数组,则在将参数传递给malloc(3)之前,最好将该数字乘以sizeof (float) (或sizeof (double))。由于samples被定义为指向double的指针,因此您应该使用:

代码语言:javascript
复制
samples = malloc(nsamples * sizeof(double));

或者更好(如果您碰巧更改了samples的声明):

代码语言:javascript
复制
samples = malloc(nsamples * sizeof *samples);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56046095

复制
相关文章

相似问题

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