Деление временного промежутка на целое число в C - PullRequest
0 голосов
/ 11 ноября 2009

Я пытаюсь разделить timeval на целое число. Вот что у меня так далеко:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
     struct timeval my_time;
     struct timeval my_time_quotient;
     int i;

     gettimeofday(&my_time, NULL);
     i = 5;

     my_time_quotient = my_time / i;

     printf("%d secs, %d msecs\n", (int)my_time_quotient.tv_sec, (int)my_time_quotient.tv_usec);

     return 0;
}

Когда я компилирую, я получаю:

jen@ubuntu:~/$ gcc -g -otimespike timespike.c
timespike.c: In function ‘main’:
timespike.c:15: error: invalid operands to binary / (have ‘struct timeval’ and ‘int’)

Как правильно найти частное?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

Вы не можете напрямую разделить struct на числовой тип, даже когда struct представляет какое-то число.

Вы должны будете сначала преобразовать вашу структуру в целочисленный тип, представляющий количество микросекунд. Поскольку элементы имеют тип int, вам нужно будет найти числовой тип с почти вдвое большим количеством бит, чем int. Надеюсь, ваш компилятор поддерживает long long int или __int64, оба из которых являются 64-битными.

После преобразования содержимого структуры в числовой тип деление происходит напрямую, как и при любом делении.

После выполнения деления вам нужно будет сохранить результат обратно во временном интервале, возможно, используя оператор «остаток после деления» или «модуль», x % y.

1 голос
/ 11 ноября 2009

Поскольку это может быть домашний вопрос, я не дам вам никакого кода, но я дам вам объяснение, почему он не работает, и подход к использованию, чтобы он работал.

Когда вы работаете с простыми старыми типами данных (целые, двойные), вы можете делить. Однако временной интервал - это не просто старый тип данных - это комбинация двух в структуре. структуры timevals не знают, как делить на целые числа (это то, что это означает, когда говорит invalid operands to binary / (have ‘struct timeval’ and ‘int’)).

Таким образом, вы должны сделать это вручную - разделите количество секунд (tv_sec), затем разделите количество наносекунд (tv_usec) и вставьте результаты этих делений обратно в ваш my_time_quotient временной интервал. Обработка доли секунд оставлена ​​читателю как упражнение, но подход, предложенный Хитом, - это один из подходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...