Easyelectronics.ru

Электроника для всех
Текущее время: 01 окт 2020, 18:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 20 июл 2016, 19:59 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Как она работает я тоже не знаю. Но по примерам делают именно как я и написал.
Код:
  time_t rawtime;
  struct tm * ptm;
  time ( &rawtime );
  ptm = gmtime ( &rawtime );

В rawtime текущее время, по нему получают указатель на структуру. И нигде нет выделения под нее памяти.
Единственное отличие, что они используют текущее время компа для начальной инициализации, которого у меня нет.
Моя первая ошибка и была, что я не получив адреса структуры пытался загнать в нее данные.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 20 июл 2016, 20:12 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3571
Откуда: Китай, Пекин
Цитата:
В rawtime текущее время, по нему получают указатель на структуру. И нигде нет выделения под нее памяти.


time_t rawtime;

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


ошибочно подумал, что обсуждают другую переменную

_________________
unirail.org


Последний раз редактировалось cheblin 20 июл 2016, 22:25, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 20 июл 2016, 20:23 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 711
Откуда: Германия
Ага. И много выделяют? Поместится ли туда struct tm?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 00:25 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
PRC писал(а):
...
И нигде нет выделения под нее памяти.
...

MasterAlexei писал(а):
...
У нее (у функции) есть своя область памяти, она (память) там всегда есть, во время выполнения вашей программы, куда она (функция) записывает результат своей работы и возвращает вам указатель на эти (свои внутренние) данные. Данные эти объявленны как static и присутствуют всегда до конца работы вашей программы.
...


Или вы про какую то другую структуру все время спрашиваете и я не догоняю?

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 02:38 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Я про структуру struct tm. Просто нигде не говорилось что сначала нужно вызвать gmtime и получить на нее ссылку. Тем более у микроконтроллеров зачастую свой, особый путь))))

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 09:53 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
PRC писал(а):
Я про структуру struct tm. Просто нигде не говорилось что сначала нужно вызвать gmtime и получить на нее ссылку. Тем более у микроконтроллеров зачастую свой, особый путь))))

Нигде не говорилось по той причине, что этого делать НЕ надо. С чего вы взяли, что надо сначала ее вызвать, а потом еще раз ее вызвать?

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 09:59 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
вот блин не поленился, посмотрел, как она устроена, эта функция. http://www.ethernut.de/api/gmtime_8c_source.html
На строке 72 мы видим, что в библиотеке объявлена глобальная структура _tb, адрес которой вам на строке 200 возвращается.
Видие? Она УЖЕ есть. Функцию НЕ надо предварительно вызывать для какого то там выделения памяти.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 10:00 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
PRC писал(а):
Тем более у микроконтроллеров зачастую свой, особый путь))))

Может раньше так и было, но на сегодняшний день если функция стандартная, то и "путь" у нее такой, какой определен этим стандартом. А именно стандартом языка С/С++ и их Стандартных библиотек.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 15:57 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
MasterAlexei писал(а):
Она УЖЕ есть. Функцию НЕ надо предварительно вызывать для какого то там выделения памяти.

Как получить адрес этой структуры без вызовов или других действий?

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 16:21 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
PRC писал(а):
MasterAlexei писал(а):
Она УЖЕ есть. Функцию НЕ надо предварительно вызывать для какого то там выделения памяти.

Как получить адрес этой структуры без вызовов или других действий?

Хм. Никак.
Но позвольте спросить: Зачем? В чем заключается сакральный смысл доступа к этой структуре без каких либо данных, а если туда их самому записать, то при вызове этой функции или localtime (вы же внимательно прочитали страницу с докой? ) все эти данные похерятся.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 18:58 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
MasterAlexei писал(а):
В чем заключается сакральный смысл доступа к этой структуре без каких либо данных, а если туда их самому записать, то при вызове этой функции или localtime (вы же внимательно прочитали страницу с докой? ) все эти данные похерятся.

Самый простой пример - часовое время с ГПС. С приемника приходит время по гринвичу в формате hhmmss и дата ddmmyy. Мне надо перейти к местному времени, с возможным изменением даты. Соответственно я заполняю структуру, перевожу в time_t, целочисленно прибавляю пояс и перевожу обратно. На выходе у меня местное время с минимальными телодвижениями. И для начала этих действий мне нужно получить указатель на эту структуру, вызвав gmtime впустую. Потом уже можно использовать полученный адрес, но первый вызов будет именно с пустыми/не валидными данными.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 19:55 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 711
Откуда: Германия
Заводи свою структуру.

Код:
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);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 22:35 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Для всяких часовых и локальных времен есть куча дополнительных стандартных функций. Типа localtime(). Пользуйся ими.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 21 июл 2016, 23:50 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Зачем плодить сущности и делать копии структур?)))
В моем случае из накладных расходов только один вызов gmtime с 0 параметром для получения указателя. Затем идет целочисленное сложение для коррекции пояса и все.
Есть варианты проще? Localltime не годится - время берется из сообщения,а не от встроенного таймера. Точнее его можно использовать, но после синхронизации времени с ГПС, к примеру по ppm сигналам.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 22 июл 2016, 11:49 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 711
Откуда: Германия
Потому что как использовать эту структуру - написано в документации. Все остальное никто не гарантирует. Что ты пытаешься сэкономить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 22 июл 2016, 11:55 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 711
Откуда: Германия
И какое отношение localtime имеет к встроенному таймеру?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 22 июл 2016, 17:03 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
dev писал(а):
Потому что как использовать эту структуру - написано в документации. Все остальное никто не гарантирует. Что ты пытаешься сэкономить?

Как написано? По примерам вызовом gmtime)))

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 23 июл 2016, 14:38 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
PRC писал(а):
dev писал(а):
Потому что как использовать эту структуру - написано в документации. Все остальное никто не гарантирует.

Как написано? По примерам вызовом gmtime)))

Именно структуру? http://pubs.opengroup.org/onlinepubs/00 ... ime.h.html ;)
Просто в добрые старые времена понимание того, что засунутая в микроволновку для просушки кошка вывалится оттуда с некторой потерей качества её дальнейшей жизни, полагалось само собой разумеюшимся и расписывать, что раз уж некая функция возвращает указатель, который мы ей не передавали - то, подобно горячей картошке, указатель этот нужно, использовав по назначению, немедленно оставить в покое, не считалось нужным. Чем не владеем -> то не контролируем -> ждём от него пакостей -> банальный здравый смысл заставляет делать собственную копию.
Гугл свидетель - реализациям gmtime несть числа, но пяток первых попавшихся - это либо глобальный статический буфер, либо статический локальный что суть одно и тоже с т.з. того, кто пользует функцию. Тем не менее классика жанра заставляет останавливаться перед зелёным сигналом светофора в опасении "а вдруг там другой мастер-джигит сейчас на красный едет?!" - т.е., оптимизируя свою программу по самые помидоры, полагаться, что в реализации библиотеки не принял участие подобный нам оптимизатор 10040-го левела, заюзавший один буффер на всё про всё и что невинный вызов другой функции из семейки не похерит данные в "оптимизированном" буффере, а их, на минуточку, мы ещё надеялись использовать, - се несколько самонадеянно. Но, конечно, Практика критерий Истины - если не взорвалось в руках разработчика - возможно и пользователь будет цел. А уж если исходные тексты библиотеки у нас - так и вообще (Знание - Сила!) можно самолично убедиться в безопасности такого использования внутренних буфферов библиотеки - кто посмеет бросить тогда камень в нашу сторону? Ну разве что какой озабоченный портабельностью поднимет свою лапку с намозоленными подушечками пальцев в бессильном протесте. Конечно, лет эдак через пять будет шанс вспомнить его противную очкастую харю, когда скопированный нами не приходя в сознание код таки бабахнет с новой библиотекой - но до того ещё дожить надо, правда? Да и без бабахов этих порой жить скучно - мозг, привыкший к головоломкам, чахнет. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 23 июл 2016, 15:49 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
siarzhuk писал(а):
PRC писал(а):
dev писал(а):
Потому что как использовать эту структуру - написано в документации. Все остальное никто не гарантирует.

Как написано? По примерам вызовом gmtime)))

Именно структуру? http://pubs.opengroup.org/onlinepubs/00 ... ime.h.html ;)
Просто в добрые старые времена понимание того, что засунутая в микроволновку для просушки кошка вывалится оттуда с некторой потерей качества её дальнейшей жизни, полагалось само собой разумеюшимся и расписывать, что раз уж некая функция возвращает указатель, который мы ей не передавали - то, подобно горячей картошке, указатель этот нужно, использовав по назначению, немедленно оставить в покое, не считалось нужным. Чем не владеем -> то не контролируем -> ждём от него пакостей -> банальный здравый смысл заставляет делать собственную копию.
Гугл свидетель - реализациям gmtime несть числа, но пяток первых попавшихся - это либо глобальный статический буфер, либо статический локальный что суть одно и тоже с т.з. того, кто пользует функцию. Тем не менее классика жанра заставляет останавливаться перед зелёным сигналом светофора в опасении "а вдруг там другой мастер-джигит сейчас на красный едет?!" - т.е., оптимизируя свою программу по самые помидоры, полагаться, что в реализации библиотеки не принял участие подобный нам оптимизатор 10040-го левела, заюзавший один буффер на всё про всё и что невинный вызов другой функции из семейки не похерит данные в "оптимизированном" буффере, а их, на минуточку, мы ещё надеялись использовать, - се несколько самонадеянно. Но, конечно, Практика критерий Истины - если не взорвалось в руках разработчика - возможно и пользователь будет цел. А уж если исходные тексты библиотеки у нас - так и вообще (Знание - Сила!) можно самолично убедиться в безопасности такого использования внутренних буфферов библиотеки - кто посмеет бросить тогда камень в нашу сторону? Ну разве что какой озабоченный портабельностью поднимет свою лапку с намозоленными подушечками пальцев в бессильном протесте. Конечно, лет эдак через пять будет шанс вспомнить его противную очкастую харю, когда скопированный нами не приходя в сознание код таки бабахнет с новой библиотекой - но до того ещё дожить надо, правда? Да и без бабахов этих порой жить скучно - мозг, привыкший к головоломкам, чахнет. :)

История сего всего топика показывает что ТС такие длинные тексты не читает и ссылки, любезно предоставленным мимо проходящими добра желателями, не посещает. По крайней мере у меня сложилось такое впечатление.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 24 июл 2016, 00:21 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Всем чмоки в этом чатике)))
Изначально я создавал свою структуру, но указатель начинал прыгать по адресам. Это не по "офф. докам", а по отладчику.

Дальше, читающие доки предложите вариант оптимальней для задачи - "Самый простой пример - часовое время с ГПС. С приемника приходит время по гринвичу в формате hhmmss и дата ddmmyy. Мне надо перейти к местному времени, с возможным изменением даты. Соответственно я заполняю структуру, перевожу в time_t, целочисленно прибавляю пояс и перевожу обратно. На выходе у меня местное время с минимальными телодвижениями. И для начала этих действий мне нужно получить указатель на эту структуру, вызвав gmtime впустую. Потом уже можно использовать полученный адрес, но первый вызов будет именно с пустыми/не валидными данными."
Для особо упертых уточню - начальных данных нет никаких, кроме часового пояса в еепром.
А потом еще раз расскажите что мне этот указатель на хую не вертелся и он мне на тот же хуй не нужен))) Ну и про использование localltime не забудьте.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 24 июл 2016, 13:46 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3462
PRC писал(а):
Изначально я создавал свою структуру, но указатель начинал прыгать по адресам. Это не по "офф. докам", а по отладчику.


изначально
struct tm *ts;
никакой структуры не создавалось.

а использовать внутренние статические переменные по возвращаемому указателю для каких-то своих целей это из той же серии что и писать куда попало по непроинициализированным указателям - ССЗБ.

и что самое удивительное, что такое указатели не понимает PRC, а виноват конечно же time.h, очевидно в нём ошибка.
обычно сразу компилятор обвиняют, ему такой замечательный код скормили, а криворукие индусы понаписали там чёрти что, вот он и конпилит неправильно!!!11


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 24 июл 2016, 15:22 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
PRC писал(а):
.... С приемника приходит время по гринвичу в формате hhmmss и дата ddmmyy. Мне надо перейти к местному времени, с возможным изменением даты. Соответственно я заполняю структуру, перевожу в time_t, целочисленно прибавляю пояс и перевожу обратно. На выходе у меня местное время с минимальными телодвижениями. .... Ну и про использование localltime не забудьте.

Для localtime, если по науке, tzset нужно настраивать и дёргать http://pubs.opengroup.org/onlinepubs/00 ... tzset.html - иначе откуда рантайму знать в каком часовом поясе драма разворачивается и какое "Кабульское время" пользователь лицезреть соблаговолят. Вручную складывать, оно конечно нагляднее - но при масштабировании операций со временем этот hand-made быстренько самоорганизуется в эдакий бордельеро©™, что особенно оценят неблагодарные потомки, во время весёлых прогулок в лесок за новой партией осиновых кольев.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в time.h?
СообщениеДобавлено: 24 июл 2016, 15:42 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
_pv писал(а):
изначально
struct tm *ts;
никакой структуры не создавалось.

Я пропустил некоторые этапы борьбы))) Этап создания структуры там тоже был. Там была проблема, что я создаю свою структуру, указатель на нее, а мне возвращают сторонний непонятный указатель. То ли возврат идет со стека, то ли еще откуда было не очень ясно.

siarzhuk писал(а):
Для localtime, если по науке, tzset нужно настраивать и дёргать http://pubs.opengroup.org/onlinepubs/00 ... tzset.html - иначе откуда рантайму знать в каком часовом поясе драма разворачивается и какое "Кабульское время" пользователь лицезреть соблаговолят. Вручную складывать, оно конечно нагляднее - но при масштабировании операций со временем этот hand-made быстренько самоорганизуется в эдакий бордельеро©™, что особенно оценят неблагодарные потомки, во время весёлых прогулок в лесок за новой партией осиновых кольев.

Я говорил про начальную настройку времени. Потом можно и по сигналу ppm инкремент делать. Думаю инкремент целочисленной переменной будет быстрей функции, делающей тоже самое)))

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB