C- getTimeofday()上的奇怪邮票



我已经为我的大学写了此代码。

#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("%dnn",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: %fn", 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: %fndivergance: %f msnn", samples[c], divergance*1000);
      usleep(dt *1000);
    }
}

这是我的输出

时间:1557335682.435666 Divergance:200.127125 MS

时间:1557335682.635813 Divergance:200.146914 MS

时间:1557335682.835952 Divergance:200.139046 MS

时间:1557335683.036075 Divergance:200.123072 MS

时间:1557335683.236192 Divergance:

时间:1557335683.436400 Divergance:1557335683436.399902 MS

时间:1557335683.636521 Divergance:1557335683636.520752 MS

时间:1557335683.836647 Divergance:1557335683836.646973 MS

任何人都知道在第五次计算中那里的那种怪异的输出。我无法想象任何逻辑上的解释,因为我以前从未遇到过任何类似的"错误"。它与gettimeofday()函数的某些特征有关吗?

νote:输入是10200

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

samples = malloc(nsamples);

malloc函数分配了 bytes 的指定数量的空间,而不是数组元素的数量。因此,您认为的阵列要短得多。这意味着您最终将经过数组的末端,调用未定义的行为。

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

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

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

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

或更高(如果您碰巧更改samples的声明(:

samples = malloc(nsamples * sizeof *samples);

相关内容

  • 没有找到相关文章

最新更新