Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/45: Рейтинг темы: голосов - 45, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2

Ошибка в time.h?

17.07.2016, 21:40. Показов 9309. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru