Как я могу сделать тайм-аут, используя поплавки? - PullRequest
0 голосов
/ 18 мая 2019

Я хочу сделать цикл while, который скажет «Hello World» в течение 2 секунд и 500 миллисекунд (2,5 с).Код, который я сделал в настоящее время, работает с обычными целыми числами, но если я изменю его на использование чисел с плавающей запятой, он перестанет работать

Есть идеи?

Неработающий код:

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

int main(int argc, char* argv[]) {
    float timeout = time(NULL) + 2.5;

    while(time(NULL) < timeout) {
        printf("Hello World\n");
    }

    return 0;
}

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Проблема с вашим кодом в том, что:

  1. Вы используете flaot для представления результата time(), который представляет собой большое целое число и может привести к неточности преобразования из-за природы значений с плавающей запятой.

  2. Точность функции time() хороша только с точностью до секунды, поэтому ваш код никогда не будет работать в течение 2,5 секунд, но всегда будет работать в течение 3 секунд, так как вы можете продолжить только с шагом в 1 секунду .

Чтобы решить эту проблему, не используя плавающее значение (что не имеет смысла, так как большинство функций, работающих со временем, используют интегральные значения), вы можете использовать функцию gettimeofday() в Linux, или GetSystemTime(), если вы работаете в Windows.

Linux:

#include <stdio.h>
#include <sys/time.h>

unsigned long long get_time(void) {
    struct timeval time;
    gettimeofday(&time, NULL);

    return time.tv_sec * 1000 * 1000 + time.tv_usec;
}

int main(int argc, char* argv[]) {
    unsigned long long timeout = get_time() + 2500000;
    // Accurate to the microsecond.
    // 2.5 s == 2 500 000 us

    while(get_time() < timeout) {
        printf("Hello World\n");
    }

    return 0;
}

Windows

#include <stdio.h>
#include <windows.h>

unsigned long long get_time(void) {
    SYSTEMTIME time;
    GetSystemTime(&time);

    return time.wSecond * 1000 + time.wMilliseconds;
}

int main(int argc, char* argv[]) {
    unsigned long long timeout = get_time() + 2500;
    // Accurate to the millisecond.
    // 2.5 s == 2 500 ms

    while(get_time() < timeout) {
        printf("Hello World\n");
    }

    return 0;
}

ПРИМЕЧАНИЕ , что в Windows точность снижается до миллисекунды, а в Linux - до микросекунды.

0 голосов
/ 18 мая 2019

Я бы придерживался целых чисел.

Вы можете сделать это так:

#include <stdio.h>    
#include <time.h>

int main(int argc, char* argv[]) 
{
  long int timeout = time(NULL)*10 + 25;

  while(time(NULL)*10 < timeout) 
  {
    printf("hello, world\n");
  }

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