Странная печать на gettimeofday () - PullRequest
0 голосов
/ 08 мая 2019

Я написал этот код для выборочного задания в моем университете.

#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 мс

время: 1557335682.635813 расхождение: 200,146914 мс

время: 1557335682.835952 расхождение: 200,139046 мс

время: 1557335683.036075 расхождение: 200,123072 мс

время: 1557335683.236192 расхождение: -50328976507548121002151598324465532616014103321089770750300716493231241208217866953937760599346823570331739493744117764925654540012842402655523878795775819489233146901362588461216017208320541658368563434403808909221817741213696.000000 мс

время: 1557335683.436400 расхождение: 1557335683436.399902 мс

время: 1557335683.636521 расхождение: 1557335683636.520752 мс

время: 1557335683.836647 расхождение: 1557335683836.646973 мс

Кто-нибудь понимает, что это за странный вывод там при пятом расчете? Я не могу представить никакого логического объяснения, поскольку я не встречал подобной «ошибки» раньше. Связано ли это с какой-то определенной функцией gettimeofday()?

Νote: ввод 10 и 200

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Вы не выделили достаточно места для samples:

samples = malloc(nsamples);

Функция malloc выделяет пространство для указанного количества байтов , а не количества элементов массива,Таким образом, ваш массив намного короче, чем вы думаете.Это означает, что вы в конечном итоге будете писать после конца массива, вызывая неопределенное поведение .

Вам нужно умножить количество элементов на размер элемента, чтобы выделить правильное количество места:

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++;
}
0 голосов
/ 12 мая 2019

Параметр malloc(3) должен быть числом байтов , которое нужно выделить, а не количеством выборок. Если вы планируете выделить массив из float или double выборок, вам лучше умножить это число на sizeof (float) (или sizeof (double)) перед передачей параметра в malloc(3). Так как samples определен как указатель на double, то вы должны использовать:

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

или лучше (если вам случится изменить объявление samples):

samples = malloc(nsamples * sizeof *samples);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...