【问题标题】:Strange stamp on gettimeofday()gettimeofday() 上的奇怪标记
【发布时间】:2019-05-08 17:25:23
【问题描述】:

我为我大学的抽样任务编写了这段代码。

#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 毫秒

时间:1557335682.835952 发散:200.139046 毫秒

时间:1557335683.036075 偏差:200.123072 ms

时间:1557335683.236192 分歧: -50328976507548121002151598324465532616014103321089770750300716493231241208217866953937760599346823570331739493744117764925654540012842402655523878795775819489233146901362588461216017208320541658368563434403808909221817741213696.000000毫秒 P>

时间:1557335683.436400 偏差:1557335683436.399902 毫秒

时间:1557335683.636521 偏差:1557335683636.520752 毫秒

时间:1557335683.836647 偏差:1557335683836.646973 ms

有谁知道第五次计算的奇怪输出是什么。我无法想象任何合乎逻辑的解释,因为我之前没有遇到任何类似的“错误”。是否与gettimeofday()函数的某些特性有关?

注意:输入是10200

【问题讨论】:

  • 你有while(c&lt;nsamples){ c++; 所以也许samples[c] 会破坏数组。我建议从c = 1 开始并在循环的end 处递增,或进行一些类似的调整。
  • samples = malloc(nsamples) --> samples = malloc(nsamples * sizeof(*samples))
  • @dbush 非常感谢。有效。你能解释一下为什么吗?
  • @GiannisGonidelis 我已经添加了一个详细说明这一点的答案。
  • 打印的时间是正确的,所以问题显然与gettimeofday无关。

标签: c gettimeofday


【解决方案1】:

你没有为samples分配足够的空间:

samples = malloc(nsamples);

malloc 函数为指定数量的字节分配空间,而不是数组元素的数量。所以你的数组比你想象的要短得多。这意味着你最终会写到数组的末尾,调用undefined behavior

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

samples = malloc(nsamples * sizeof(*samples));

您在访问数组时也会出现非一错误:

int c = 0;
...
while(c<nsamples){
  c++;
  ...
  samples[c] = time;
  ...
}

这也会写到数组的末尾,特别是一个数组元素太多了。

将循环更改为从值 1 开始并在末尾递增。

int c = 0;
...
c = 1;
while(c<nsamples){
  ...
  samples[c] = time;
  ...
  c++;
}

【讨论】:

    【解决方案2】:

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

    samples = malloc(nsamples * sizeof(double));
    

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

    samples = malloc(nsamples * sizeof *samples);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多