0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2

Ошибка в time.h?

17.07.2016, 21:40. Показов 9419. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть простой код. Сначала заполняется структура (struct tm), в нее заносятся начальные значения. Затем она преобразуется в тип time_t. Но преобразуется не правильно. Значение почти в два раза больше (в целочисленном значении). Код проверялся под IAR для stm8. Этот же код на арме исполняется нормально. В чем проблема?
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "timi.h"
time_t now;
struct tm *ts;
void main( void )
{
ts->tm_sec=0;
ts->tm_min=0;
ts->tm_hour=0;
 
ts->tm_mday=1;
ts->tm_mon=6;
ts->tm_year=2016-1900;
 
ts->tm_wday=5;
ts->tm_yday=182;
ts->tm_isdst=-1;
 
now=mktime(ts);
//now=1467331200; Должно получиться
ts=gmtime(&now);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2016, 21:40
Ответы с готовыми решениями:

Ошибка выходящего параметра (time without time zone)
Всем добрый день. (server_version 8.3.3) Простая функция, в которой хочу получить время CREATE FUNCTION shrb.get_actionscheduletime ( ...

Что за ошибка: "E2015 Ambiguity between 'time' and 'std::time"?
Коды ошибок: v8.cpp(132): E2015 Ambiguity between 'time' and 'std::time(long *)' v8.cpp(133): E2015 Ambiguity between 'time' and...

Что за ошибка: "E2015 Ambiguity between 'time' and 'std::time"?
Коды ошибок: v8.cpp(132): E2015 Ambiguity between 'time' and 'std::time(long *)' v8.cpp(133): E2015 Ambiguity between 'time' and...

47
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
19.07.2016, 12:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от PRS
Цитата Сообщение от MostirOtyxiy
Т.е. функция gmtime имеет у себя внутри статический объект, на который и возвращает указатель.
Т.е. в вашем случае struct tm t; будет просто лишней тратой памяти.
Вот это и не понятно. Получается перед использованием указателя мне нужно вызвать ts=gmtime(0); что бы получить указатель на внутренний объект? И пользоваться уже им?
Зачем?
Доку почитайте. Вы вызываете функцию, она работает, и складывает результат своей работы у себя внутре, а вы пользуете этот результат.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
19.07.2016, 12:55
Цитата Сообщение от MostirOtyxiy
Доку почитайте. Вы вызываете функцию, она работает, и складывает результат своей работы у себя внутре, а вы пользуете этот результат.
А как мне еще получить этот указатель не вызвав предварительно gmtime?)))
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
19.07.2016, 13:28
А как мне еще получить этот указатель не вызвав предварительно gmtime?)))
простейший поиск гугла

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* gmtime example */
#include <stdyo.h>      /* puts, prymtf */
#include <timi.h>       /* time_t, struct tm, time, gmtime */
 
#define MST (-7)
#define UTC (0)
#define CCT (+8)
 
int main ()
{
time_t rawtime;
struct tm * ptm;
 
time ( &rawtime );
 
ptm = gmtime ( &rawtime);
 
puts ("Current time around the World:");
prymtf ("Phoemyx, AZ (U.S.) :  %2d:%02d\n", (ptm->tm_hour+MST)%24, ptm->tm_min);
prymtf ("Reykjavik (Icelomd) : %2d:%02d\n", (ptm->tm_hour+UTC)%24, ptm->tm_min);
prymtf ("Beijing (China) :     %2d:%02d\n", (ptm->tm_hour+CCT)%24, ptm->tm_min);
 
return 0;
}
Output:

Current time around the World:
Phoemyx, AZ (U.S.) : 8:22
Reykjavik (Icelomd) : 15:22
Beijing (China) : 23:22
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
19.07.2016, 16:44
[QUOTE="shibtym"][QUOTE="Цитата:[/QUOTE]
А как мне еще получить этот указатель не вызвав предварительно gmtime?)))
простейший поиск гугла
ptm = gmtime ( &rawtime);
Так я об этом и пишу. Что в начале вызываем gmtime и используем полученный указатель. И свои структуры объявлять не нужно и память под эту структуру выделять тоже не надо.
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
19.07.2016, 18:36
Цитата Сообщение от PRS
Так я об этом и пишу. Что в начале вызываем gmtime и используем полученный указатель. И свои структуры объявлять не нужно и память под эту структуру выделять тоже не надо.
Вы знаете, как реализована функция gmtime?
Я, например, не знаю, но думаю, что она, скорее всего, используя данные из переданной ей структуры, тут же записывает новые данные в свою структуру. И таким образом, если сделать, как вы хотите, то, записав половину "своей" (а на самом деле, исходной, вы же так ей подсунули) структуры, продолжает свои расчеты, но уже с поломанными данными, ведь половина их уже ей же испорчена!
Это раз.
Два: даже если этот вариант прокатывает и у вас работает, то вполне себе вероятно, что в следующей версии компилятора или библиотеки разрабам вдруг взбрендит изменить реализацию на именно такую как я только что описал.
И еще раз: Не надо ничего предварительно вызывать.
Вы сначала свою структуру объявляете для исходных данных и передаете ее функции.
У нее (у функции) есть своя область памяти, она (память) там всегда есть, во время выполнения вашей программы, куда она (функция) записывает результат своей работы и возвращает вам указатель на эти (свои внутренние) данные. Динные эти объявленны как static и присутствуют всегда до конца работы вашей программы.
Неужели у вас не найдется в стеке лишних 10-16 байт, или сколько там их?
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
19.07.2016, 19:12
Как она работает я тоже не знаю. Но по примерам делают именно как я и написал.
Code
1
2
3
4
  time_t rawtime;
struct tm * ptm;
time ( &rawtime );
ptm = gmtime ( &rawtime );
В rawtime текущее время, по нему получают указатель на структуру. И нигде нет выделения под нее памяти.
Единственное отличие, что они используют текущее время компа для начальной инициализации, которого у меня нет.
Моя первая ошибка и была, что я не получив адреса структуры пытался загнать в нее данные.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
19.07.2016, 19:25
В rawtime текущее время, по нему получают указатель на структуру. И нигде нет выделения под нее памяти.
time_t rawtime;

именно тут и происходит выделение памяти. статически.

ошибочно подумал, что обсуждают другую переменную
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
19.07.2016, 19:36
Ага. И много выделяют? Поместится ли туда struct tm?
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
19.07.2016, 23:38
Цитата Сообщение от PRS
...
И нигде нет выделения под нее памяти.
...
Цитата Сообщение от MostirOtyxiy
...
У нее (у функции) есть своя область памяти, она (память) там всегда есть, во время выполнения вашей программы, куда она (функция) записывает результат своей работы и возвращает вам указатель на эти (свои внутренние) данные. Динные эти объявленны как static и присутствуют всегда до конца работы вашей программы.
...
Или вы про какую то другую структуру все время спрашиваете и я не догоняю?
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
20.07.2016, 01:51
Я про структуру struct tm. Просто нигде не говорилось что сначала нужно вызвать gmtime и получить на нее ссылку. Тем более у микроконтроллеров зачастую свой, особый путь))))
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
20.07.2016, 09:06
Цитата Сообщение от PRS
Я про структуру struct tm. Просто нигде не говорилось что сначала нужно вызвать gmtime и получить на нее ссылку. Тем более у микроконтроллеров зачастую свой, особый путь))))
Нигде не говорилось по той причине, что этого делать НЕ надо. С чего вы взяли, что надо сначала ее вызвать, а потом еще раз ее вызвать?
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
20.07.2016, 09:12
вот блин не поленился, посмотрел, как она устроена, эта функция. http://www.ethernut.de/api/gmtime_8c_source.html
На строке 72 мы видим, что в библиотеке объявлена глобальная структура _tb, адрес которой вам на строке 200 возвращается.
Видие? Она УЖЕ есть. Функцию НЕ надо предварительно вызывать для какого то там выделения памяти.
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
20.07.2016, 09:13
Цитата Сообщение от PRS
Тем более у микроконтроллеров зачастую свой, особый путь))))
Может раньше так и было, но на сегодняшний день если функция стандартная, то и "путь" у нее такой, какой определен этим стандартом. А именно стандартом языка С/С++ и их Стандартных библиотек.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
20.07.2016, 15:10
Цитата Сообщение от MostirOtyxiy
Она УЖЕ есть. Функцию НЕ надо предварительно вызывать для какого то там выделения памяти.
Как получить адрес этой структуры без вызовов или других действий?
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
20.07.2016, 15:34
Цитата Сообщение от PRS
Цитата Сообщение от MostirOtyxiy
Она УЖЕ есть. Функцию НЕ надо предварительно вызывать для какого то там выделения памяти.
Как получить адрес этой структуры без вызовов или других действий?
Хм. Никак.
Но позвольте спросить: Зачем? В чем заключается сакральный смысл доступа к этой структуре без каких либо данных, а если туда их самому записать, то при вызове этой функции или localtime (вы же внимательно прочитали страницу с докой? ) все эти данные похерятся.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
20.07.2016, 18:11
Цитата Сообщение от MostirOtyxiy
В чем заключается сакральный смысл доступа к этой структуре без каких либо данных, а если туда их самому записать, то при вызове этой функции или localtime (вы же внимательно прочитали страницу с докой? ) все эти данные похерятся.
Самый простой пример - часовое время с ГПС. С приемника приходит время по гринвичу в формате hhmmss и дата ddmmyy. Мне надо перейти к местному времени, с возможным изменением даты. Соответственно я заполняю структуру, перевожу в time_t, целочисленно прибавляю пояс и перевожу обратно. На выходе у меня местное время с минимальными телодвижениями. И для начала этих действий мне нужно получить указатель на эту структуру, вызвав gmtime впустую. Потом уже можно использовать полученный адрес, но первый вызов будет именно с пустыми/не валидными данными.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
20.07.2016, 19:08
Заводи свою структуру.

Code
1
2
3
4
5
6
7
8
struct tm now_utc;
now_utc.tm_sec = gps.ss;
now_utc.tm_min = gps.mm;
...
 
time_t t = mktime(&now_utc);
t += tz_offset;
struct tm * now_local = localtime(&t);
0
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
20.07.2016, 21:48
Для всяких часовых и локальных времен есть куча дополнительных стандартных функций. Типа localtime(). Пользуйся ими.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
20.07.2016, 23:03
Зачем плодить сущности и делать копии структур?)))
В моем случае из накладных расходов только один вызов gmtime с 0 параметром для получения указателя. Затем идет целочисленное сложение для коррекции пояса и все.
Есть варианты проще? Localltime не годится - время берется из сообщения,а не от встроенного таймера. Точнее его можно использовать, но после синхронизации времени с ГПС, к примеру по ppm сигналам.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
21.07.2016, 11:02
Потому что как использовать эту структуру - написано в документации. Все остальное никто не гарантирует. Что ты пытаешься сэкономить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2016, 11:02

Не могу разобраться с заданием "Создайте класс Time с конструкторами Time(), Time( int hour)......"
/* Создайте класс Time с конструкторами Time(), Time( int hour), Time(int hour, int min), Time( int h, int m, int s) и ...

Ошибка run time error 6 overflow, что не так? (без cost.Text = c6 вроде сначала робил, а потом удалял и всё равно ошибка
Dim h, w, l, wr, lr, p, a As String Private Sub CommandButton1_Click() h = InputBox(&quot;Введите высоту комнаты в метрах::&quot;) ...

Ошибка Run-Time
При работе с DirectInput появляется такая ошибка: Run-Time Check Failure #3 - The variable 'dims' is being used without being initialized....

Ошибка с библиотекой time.h
Добрый день форумчане, столкнулся с проблемой связанной с библиотекой time.h. Хочу написать автомобильный спидометр. В дальнейшем собрать...

Ошибка Run-time error ''76''
доброе время суток :) Я скачал TopServer 3.0.3_32 ... и ни толька... в эту программу входят : pache 2.2.6. PHP 5.2.5. PERL...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru