Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2017, 20:36   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию time_t & struct tm глюки со временем

Доброго времени суток.
Считал дату и время из файла в формате: количество секунд от 06.01.1980 00:00:00 до рассчитываемой даты.

Считанные даты представляют собой список из 1450 строк (нас интересует первые 2 столбца).

Вот несколько последних:
Код:
14.10.2017 09:21:12	1192008072	-6532.788771	-621.002367	-616.717828	0.953669	-4.294276	-6.059116
14.10.2017 08:21:15	1192008075	-6529.889782	-633.881940	-634.891301	0.979001	-4.292083	-6.056490
14.10.2017 08:21:18	1192008078	-6526.914819	-646.754879	-653.056776	1.004321	-4.289851	-6.053788
14.10.2017 09:21:21	1192008081	-6523.863884	-659.621049	-671.214037	1.029637	-4.287573	-6.051006
14.10.2017 09:21:24	1192008084	-6520.737051	-672.480332	-689.362858	1.054927	-4.285252	-6.048159
14.10.2017 08:21:36	1192008096	-6507.471529	-723.845967	-761.869118	1.155970	-4.275554	-6.035986
14.10.2017 09:21:39	1192008099	-6503.965813	-736.668878	-779.972297	1.181195	-4.273024	-6.032752
14.10.2017 08:21:42	1192008102	-6500.384433	-749.484141	-798.065659	1.206409	-4.270451	-6.029442
14.10.2017 08:21:45	1192008105	-6496.727411	-762.291620	-816.148985	1.231613	-4.267834	-6.026060
14.10.2017 09:21:48	1192008108	-6492.994892	-775.091201	-834.222043	1.256791	-4.265176	-6.022598
14.10.2017 09:21:54	1192008114	-6485.303343	-800.666112	-870.336487	1.307088	-4.259735	-6.015450
Выводимые значения хранятся в списке.

typedef struct
{
unsigned int timeGMT;
struct tm localTimeGMT;
double X,Y,Z;
float VX,VY,VZ;
struct GSKpackage* next;
} GSKpackage;

Иду по списку и с помощью написанной функции вычисляю дату:

Код:
void calcGSKpackageTime(GSKpackage* gsk)
{
    struct tm tempTMtime;
    time_t tempTime_tTime;


    tempTMtime.tm_year = 80;
    tempTMtime.tm_mon = 0;//0-11
    tempTMtime.tm_mday = 6;

    tempTMtime.tm_hour = 0;
    tempTMtime.tm_min = 0;
    tempTMtime.tm_sec = 0;


    tempTime_tTime = mktime(&tempTMtime);

    tempTime_tTime += (long int)gsk->timeGMT - Secs;

    tempTMtime = *localtime(&tempTime_tTime);

    gsk->localTimeGMT = tempTMtime;

}

Сам проход по списку:

Код:
 prevGSKpackage = beginGSKpackage;


    while(prevGSKpackage)
    {
        calcGSKpackageTime(prevGSKpackage);//считаем время

        GSKvectorPrint(*prevGSKpackage);

        prevGSKpackage = (GSKpackage*)prevGSKpackage->next;
    }
И функции вывода векторов:

Код:
void GSKvectorPrint(GSKpackage gsk)
{
    //double _absVec;
    double Xkm,Ykm,Zkm;

    Xkm = gsk.X/1000.0;
    Ykm = gsk.Y/1000.0;
    Zkm = gsk.Z/1000.0;

   // printf("%li\t",(long int)gsk.timeGMT - Secs);

    printTMtime(gsk.localTimeGMT);
    printf("\t");

    printf("%li\t",(long int)gsk.timeGMT - Secs);

    printf("%f\t",Xkm);
    printf("%f\t",Ykm);
    printf("%f\t",Zkm);

    printf("%f\t",gsk.VX/1000.0);
    printf("%f\t",gsk.VY/1000.0);
    printf("%f\n",gsk.VZ/1000.0);


  //  QDateTime dt = QDateTime(QDate(1980,1,6),QTime(0,0,0,0));


   // _absVec = sqrt(Xkm*Xkm + Ykm*Ykm + Zkm*Zkm);

    //printf("%f\n",_absVec - R_EARTH);


}
для времени

Код:
void printTMtime(struct tm tm_time)
{
    printf("%02d.%02d.%4d %02d:%02d:%02d",tm_time.tm_mday,tm_time.tm_mon + 1,tm_time.tm_year + 1900,tm_time.tm_hour,tm_time.tm_min,tm_time.tm_sec);
}
Вопрос: почему время, посчитанное в функции calcGSKpackageTime, ведёт себя странным образом? Сначала идёт 8 часов, потом 9, потом снова 8.
Я не правильно делаю преобразования из struct tm в time_t и обратно?
Как исправить?
Спасибо.

ПС

По растущему количеству секунд от 06.01.1980 (второй столбец) можно сделать вывод, что я считал время правильно. Ошибка зарылась именно в преобразовании.
ivan.tiran вне форума Ответить с цитированием
Старый 14.11.2017, 20:45   #2
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

#define Secs 18

Secs константа, если что.
ivan.tiran вне форума Ответить с цитированием
Старый 14.11.2017, 21:25   #3
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Помогло после объявления структуры вот что
Код:
struct tm tempTMtime;

    memset(&tempTMtime, 0, sizeof(struct tm));
Теперь тогда такой вопрос.
Я всегда должен, объявляя любую структуру, делать memset?

Я раньше никогда его не делал, и всё работало.
ivan.tiran вне форума Ответить с цитированием
Старый 14.11.2017, 21:35   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

свои структуры я тоже должен обнулять таким образом?

Код:
typedef struct
{
    unsigned int timeGMT;
    struct tm localTimeGMT;
    double X,Y,Z;
    float VX,VY,VZ;
    struct GSKpackage* next;
} GSKpackage;



typedef struct
{
    unsigned char left_byte[8];
    unsigned char right_byte[8];
    struct TCMI_vector_part *next;

}
TCMI_vector_part;



typedef struct
{
    unsigned short int word[128];
    struct TCMI_vector *next;
}
TCMI_vector;
ivan.tiran вне форума Ответить с цитированием
Старый 14.11.2017, 21:54   #5
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Никто не хочет отвечать.

Везде обнулил созданные переменные структур. Думаю, лишним не будет.
Видимо, это чисто сишная вещь.

А до этого писал на С++.
ivan.tiran вне форума Ответить с цитированием
Старый 14.11.2017, 22:02   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Это и С, и С++ вещь. Компилятор в релизе не чистит локальные переменные.
p51x на форуме Ответить с цитированием
Старый 14.11.2017, 22:20   #7
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Это и С, и С++ вещь. Компилятор в релизе не чистит локальные переменные.
спасибо.
ivan.tiran вне форума Ответить с цитированием
Старый 14.11.2017, 22:29   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

На С++ вы привыкли к конструкторам - они делают значение по умолчанию 0. Но, если, нет конструктора, то компилятор ничего не делает сам. Там мусор. Причем мусор условный, скажем, если вы не запускаете 100500 программ и вкладок броузера, то операционка вам весь день будет давать программе 1 и ту же страницу памяти, которая изначально 0, а потом вашими "почти верными" данными забита. И вы ничего не заметите.

Даже в дебуг сборках есть ключи - забивать все мусором рандомным принудительно (т.е. компилер сам "чистит", но мусором), что позволяет выявлять вот все такое.

Последний раз редактировалось alexzk; 14.11.2017 в 22:35.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать struct Группа(group), в которой содержатся struct Студент(Student) TokaChan Помощь студентам 2 07.07.2016 07:22
не перегружается ostream& operator<<(ostream &, Card&) Antej Общие вопросы C/C++ 2 17.12.2012 14:02
fstream && struct Hacker19_90 Общие вопросы C/C++ 12 03.06.2012 11:50
Вывод значения time_t и значения uid_t и gid_t papos Помощь студентам 0 23.02.2011 21:49
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46