Easyelectronics.ru

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

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



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

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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Есть простой код. Сначала заполняется структура (struct tm), в нее заносятся начальные значения. Затем она преобразуется в тип time_t. Но преобразуется не правильно. Значение почти в два раза больше (в целочисленном значении). Код проверялся под IAR для stm8. Этот же код на арме исполняется нормально. В чем проблема?
Код:
#include "time.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);
}

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


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

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Указатель вижу, а на что он указывает?

Код:
#include "time.h"
time_t now;
struct tm ts;
void main( void )
{
  ts.tm_sec=0;
  ts.tm_min=0;
  ts.tm_hour=0;
...
  now=mktime(&ts);
  //now=1467331200; Должно получиться
  ts=gmtime(&now);
}


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Мне этот момент тоже не понятен, но так в примерах иара пишут. Если делать как положено, то выдаст ошибку - "expression must have pointer type".

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


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

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Не в этом дело. Ты сделал указатель, но на что он указывает? Ты не выделил память под структуру.


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3571
Откуда: Китай, Пекин
ваше
Код:
struct tm *ts;

не эквивалентно
Код:
struct tm orig;

у них

_________________
unirail.org


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Все разобрался. Все работает)))
Как обычно сам дурак был)))

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


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3571
Откуда: Китай, Пекин
Цитата:
Код проверялся под IAR для stm8. Этот же код на арме исполняется нормально.

потому я и говорю: С - тошниловка!

_________________
unirail.org


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
cheblin писал(а):
Цитата:
Код проверялся под IAR для stm8. Этот же код на арме исполняется нормально.

потому я и говорю: С - тошниловка!

Это так звезды сложились и я догадываюсь почему. Могло и наоборот быть. Теперь везде работает одинаково правильно.

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


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

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

...это понятно всем кто лабает на сях. НО(!) нормальный язык програмирования/компилятор не должны такого допускать!

_________________
unirail.org


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4730
Откуда: КЧР, поселок Нижний Архыз
Тут не в языке проблема, а в прослойке между креслом и клавиатурой.
Как раз таки нормальный ЯП должен быть гибким и удобным. Только С с этой задачей справляется. Остальное - ужас какой-то!


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3571
Откуда: Китай, Пекин
нормальный язык + компилятор обязаны сводить к минимуму ситуации когда программа работает/не работает в зависимости от "расположения звёзд".
Цитата:
Только С

я тоже вынужден жрать этот кактус, альтернативы нет. пока нет.... но с появлением "STM64" с размерами и ценой нынешней STM8 всё может измениться....

_________________
unirail.org


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

Зарегистрирован: 25 мар 2011, 23:43
Сообщения: 205
Откуда: СПб
Вообще компиляторы в таких случаях обычно ворнинг кидают


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

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Integrator писал(а):
Вообще компиляторы в таких случаях обычно ворнинг кидают


С точки зрения языка и компилятора тут нет ничего неправильного.


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

Зарегистрирован: 25 мар 2011, 23:43
Сообщения: 205
Откуда: СПб
kitekat писал(а):
С точки зрения языка и компилятора тут нет ничего неправильного.

Операции разыменования с неинициализированным указателем это undefined behavior


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Integrator писал(а):
kitekat писал(а):
С точки зрения языка и компилятора тут нет ничего неправильного.

Операции разыменования с неинициализированным указателем это undefined behavior

Компилятору только это не известно. Указатель объявлен глобально был.

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


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

Зарегистрирован: 25 мар 2011, 23:43
Сообщения: 205
Откуда: СПб
Да, ошибся. С глобальным указателем действительно ворнинга нет


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Еще есть непонятка. Как gmtime возвращает результат?
struct tm t;
struct tm *ts=&t;
ts=gmtime(&now);
Значение в t не изменяется, а ts меняется.
Если выделить под указатель память ts=malloc(sizeof(ts)); то значение возвращается нормально.

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


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3571
Откуда: Китай, Пекин
Код:
struct tm t; //в памяти под struct tm отводится место. адрес t типа struct tm совпадает с адресом выделеной памяти struct tm
struct tm *ts=&t; //переменной ts типа указатель на struct tm передается адрес t которая, по совместительству адес выделеной памяти struct tm.  адрес самой переменной ts НЕ совпадает с адресом выделеной памяти struct tm
ts=gmtime(&now);//переменной ts ПЕРЕприсваивается значение возвращёное из gmtime


Цитата:
Если выделить под указатель память ts=malloc(sizeof(ts)); то значение возвращается нормально.

вот этого не понял

_________________
unirail.org


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

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
PRC писал(а):
Еще есть непонятка. Как gmtime возвращает результат?
struct tm t;
struct tm *ts=&t;
ts=gmtime(&now);
Значение в t не изменяется, а ts меняется.
Если выделить под указатель память ts=malloc(sizeof(ts)); то значение возвращается нормально.

Если верить официальной доке, то
Цитата:
The returned value points to an internal object

Т.е. функция gmtime имеет у себя внутри статический объект, на который и возвращает указатель.
Т.е. в вашем случае struct tm t; будет просто лишней тратой памяти.

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


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
MasterAlexei писал(а):
Т.е. функция gmtime имеет у себя внутри статический объект, на который и возвращает указатель.
Т.е. в вашем случае struct tm t; будет просто лишней тратой памяти.

Вот это и не понятно. Получается перед использованием указателя мне нужно вызвать ts=gmtime(0); что бы получить указатель на внутренний объект? И пользоваться уже им?

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


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

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
PRC писал(а):
MasterAlexei писал(а):
Т.е. функция gmtime имеет у себя внутри статический объект, на который и возвращает указатель.
Т.е. в вашем случае struct tm t; будет просто лишней тратой памяти.

Вот это и не понятно. Получается перед использованием указателя мне нужно вызвать ts=gmtime(0); что бы получить указатель на внутренний объект? И пользоваться уже им?

Зачем?
Доку почитайте. Вы вызываете функцию, она работает, и складывает результат своей работы у себя внутре, а вы пользуете этот результат.

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


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

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

А как мне еще получить этот указатель не вызвав предварительно gmtime?)))

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


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

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3571
Откуда: Китай, Пекин
Цитата:
А как мне еще получить этот указатель не вызвав предварительно gmtime?)))

простейший поиск гугла


Код:
/* gmtime example */
#include <stdio.h>      /* puts, printf */
#include <time.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:");
  printf ("Phoenix, AZ (U.S.) :  %2d:%02d\n", (ptm->tm_hour+MST)%24, ptm->tm_min);
  printf ("Reykjavik (Iceland) : %2d:%02d\n", (ptm->tm_hour+UTC)%24, ptm->tm_min);
  printf ("Beijing (China) :     %2d:%02d\n", (ptm->tm_hour+CCT)%24, ptm->tm_min);

  return 0;
}


Output:

Current time around the World:
Phoenix, AZ (U.S.) : 8:22
Reykjavik (Iceland) : 15:22
Beijing (China) : 23:22

_________________
unirail.org


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

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
cheblin писал(а):
Цитата:
А как мне еще получить этот указатель не вызвав предварительно gmtime?)))

простейший поиск гугла
ptm = gmtime ( &rawtime);

Так я об этом и пишу. Что в начале вызываем gmtime и используем полученный указатель. И свои структуры объявлять не нужно и память под эту структуру выделять тоже не надо.

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


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

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

Вы знаете, как реализована функция gmtime?
Я, например, не знаю, но думаю, что она, скорее всего, используя данные из переданной ей структуры, тут же записывает новые данные в свою структуру. И таким образом, если сделать, как вы хотите, то, записав половину "своей" (а на самом деле, исходной, вы же так ей подсунули) структуры, продолжает свои расчеты, но уже с поломанными данными, ведь половина их уже ей же испорчена!
Это раз.
Два: даже если этот вариант прокатывает и у вас работает, то вполне себе вероятно, что в следующей версии компилятора или библиотеки разрабам вдруг взбрендит изменить реализацию на именно такую как я только что описал.
И еще раз: Не надо ничего предварительно вызывать.
Вы сначала свою структуру объявляете для исходных данных и передаете ее функции.
У нее (у функции) есть своя область памяти, она (память) там всегда есть, во время выполнения вашей программы, куда она (функция) записывает результат своей работы и возвращает вам указатель на эти (свои внутренние) данные. Данные эти объявленны как static и присутствуют всегда до конца работы вашей программы.
Неужели у вас не найдется в стеке лишних 10-16 байт, или сколько там их?

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


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


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


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

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


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

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

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