2016-10-29 12 views
2

Новый оптимизатор указателя/адреса.Как избежать переменной time_t?

В качестве упражнения я написал этот код.

/* ------------------------------------------------------------- 
FUNC : dateplusdays (date plus days) 
      add/substract days to/from date 
      days can be positive or negative 
PARAMS : date (int, format yyyymmdd), days (int) 
RETURNS : date (int, format yyyymmdd) 
REMARKS : 
---------------------------------------------------------------- */ 
int dateplusdays(int date_1, int days) { 

    int year, month, day; 
    int date_2; 
    struct tm time; 
    time_t time_seconds; 

    year = (int) floor(date_1/10000.0); 
    month = (int) (floor(date_1/100.0) - year * 100); 
    day = (int) (floor(date_1) - month * 100 - year * 10000); 

    time.tm_sec = 0; 
    time.tm_min = 0; 
    time.tm_hour = 0; 
    time.tm_year = year - 1900; 
    time.tm_mon = month - 1; 
    time.tm_mday = day; 

    time_seconds = mktime(&time) + days * 86400; 
    time = *localtime(&time_seconds); 

    date_2 = (time.tm_year + 1900) * 10000 + (time.tm_mon + 1) * 100 + time.tm_mday; 

    return date_2; 

} 

Теперь для упражнений цели, я хотел бы поставить эти 2 строки в одной строке, следовательно, избежать переменных TIME_SECONDS.

time_seconds = mktime(&time) + days * 86400; 
    time = *localtime(&time_seconds); 

localtime требует адрес переменной time_t. Я не вижу, как пропустить шаг, используя переменную time_t.

+3

Не беспокойтесь. Это вряд ли приведет к более оптимизированному коду. Просто напишите код, как сейчас (что, возможно, легче читать), и пусть компилятор (который в наши дни довольно хорош) выполняет свою работу. – kaylum

ответ

1

time = localtime((time_t[]){mktime(&time) + days * 86400});

Это называется делает "соединение буквальным".

+1

И примерно в десять раз прочнее читать как оригинал. И, скорее всего, не менее эффективен. Никакой оскорбления не предназначено - ведь вы просто правильно ответили на вопрос, но я бы уволил любого, кто построил что-то подобное в моем коде ... – tofro

+1

Я полностью согласен. Я никогда не видел, чтобы кто-то делал это в 15 лет программирования C. Я даже не помню, как я это знаю. Возможно, из другого вопроса о стеке. –