реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Объясните смысл особенностей некоторых библиотечных функций С, В частности localtime()
Dog Pawlowa
сообщение Aug 27 2009, 08:43
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Насколько я понимаю, она возвращает указатель на структуру tm, создаваемую компилятором в статической памяти, в результате память расходуется.
Расположить структуру самому в стеке нет возможности.
Где-то видел ссылки на localtime_r, но в IAR ее нет, и нет уверенности, что там структура не болтается в памяти тоже.
И? куда деваться ембеддеру? Конечно, подумаешь 20 байт, но вот так байт за байтиком ...


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 27 2009, 09:06
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dog Pawlowa @ Aug 27 2009, 10:43) *
Насколько я понимаю, она возвращает указатель на структуру tm, создаваемую компилятором в статической памяти

Не бязательно, но где-то....
Цитата
И? куда деваться ембеддеру?

В библиотеках обычно есть функция для внутреннего пользования библиотеки c указателем - можно ее найти и пользовать.
Или просто свою написать, можно и по мотивам библиотечной. У меня с начала 90x "своя" (вроде с борланда тянул), правда стуктура статически выделяется, но подправите smile.gif, заодно и "лишнее" выкините
Код
//---------------------------------------------------------------------------
//    Fills the time structure tm by translating the unixtime
//
static const char _Days[12] = {
  31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  };

static const short _monthDay [13] = {
   0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
};
struct  tm timex = {
   0, 0, 0, 1, 0, 107, 4, 0, 0
};     // 1 jan 2007

//---------------------------------------------------------------------------
struct tm *tmtime( time_t utime, int dst )
{
int i;
int cumdays;

       if( utime < 0 )
        utime = 0;
    utime +=  timezone*3600L;
    timex.tm_sec = (int)(utime % 60);
    utime /= 60;                            // Time in minutes
    timex.tm_min = (int)(utime % 60);
    utime /= 60;                            // Time in hours
    i = (unsigned)(utime / (1461L*24L));       // Number of 4 year blocks
    timex.tm_year = (i << 2);
    timex.tm_year += 70;
    cumdays = 1461*i;
    utime %= 1461L*24L;                        // Hours since end of last 4 year block

    for(;; )
       {   int hpery = 365*24;
        if( ( timex.tm_year & 3 ) == 0 )
            hpery += 24;
        if( utime < hpery )
            break;
        cumdays += hpery/24;
        timex.tm_year++;
        utime -= hpery;
    }                                       // At end, utime is number of hours into current year

    if( dst && __isDST( (int)(utime % 24), (int)(utime / 24), 0, timex.tm_year-70 ) )
       {   utime++;
        timex.tm_isdst = 1;
    }
    else
        timex.tm_isdst = 0;

    timex.tm_hour = (int)( utime % 24 );
    utime /= 24;             // Time in days
    timex.tm_yday = (int)utime;
    cumdays += (int)utime + 4;
    timex.tm_wday = cumdays % 7;
    utime++;

    if( ( timex.tm_year & 3 ) == 0 )
    {   if( utime > 60 )
            utime--;
        else
        {   if( utime == 60 )
            {   timex.tm_mon = 1;
                timex.tm_mday = 29;
                return( &timex );
            }
        }
    }
    for( timex.tm_mon = 0; _Days[timex.tm_mon] < utime; timex.tm_mon++ )
        utime -= _Days[timex.tm_mon];

    timex.tm_mday = (int)(utime);

    return( &timex );
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 27 2009, 09:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(zltigo @ Aug 27 2009, 12:06) *
Или просто свою написать, можно и по мотивам библиотечной. У меня с начала 90x "своя" (вроде с борланда тянул), правда стуктура статически выделяется, но подправите smile.gif, заодно и "лишнее" выкините

Спасибо.
Правильно, конечно, "выпить и закрепитель" - сделать свою mktime тоже smile.gif
Но вначале запущу всю обработку времени, ибо свои упрощенные функции не потянули новых требований обработки timestamp'ов.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 27 2009, 09:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dog Pawlowa @ Aug 27 2009, 11:39) *
Правильно, конечно, "выпить и закрепитель" - сделать свою mktime тоже smile.gif

Уговорили smile.gif
Код
//---------------------------------------------------------------------------
// Converts a date expressed in local time to the number of seconds
// elapsed since year 70 (1970) in calendar time.
//---------------------------------------------------------------------------
time_t getunixtime(void)
{
int leaps, year, month, day, hour, min, sec,  days;
time_t utime;

    do{
        sec = SEC;
        year = YEAR;
        month = MONTH;
        day = DOM;
        hour = HOUR;
        min = MIN;
    }
    while( sec != SEC );


    if( year < 1970 || year > 2038)
           return( (time_t)(-1) );

    year -= 1970;
       leaps = (year+2)/4;
       if( !((year+70) & 3) && ( month < 3) )
        --leaps;

       days = year*365L + leaps + _monthDay[month-1] + (day-1);
    utime = days*86400L + (hour+timezone)*3600L + min*60L;
    utime += sec;

    if( __isDST( hour+timezone, day, month, year ) )
        utime -= 3600L;

    return( utime );
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016