Sscanf And Mktime

  • Автор темы Pingvin1
  • Дата начала
P

Pingvin1

Противоречие: функция sscanf работает с элементами структуры, если структура определена без звёздочки, а mktime нормально работает, если аргумент = структура определенна со *.


Хотелось чтоб заработал пример: sscanf and mktime
C++:
#include <stdio.h>
#include <ctime>
using namespace std;// cin cout \n \n

int main(int NumberofArgs, char* pszArgs[])	{
//	time_t rawtime;
//	time ( &rawtime );				 //текущая дата в секундах
//	struct tm *zap_data;
struct tm zap_data;
//	zap_data = localtime ( &rawtime ); //текущее локальное время, представленное в структуре
time_t zap_sec;
char date[11]="8.7.2014";
sscanf(date,"%d.%d.%d",&zap_data.tm_mday,&zap_data.tm_mon,&zap_data.tm_year);
zap_sec=mktime(zap_data);//[Error] cannot convert 'tm' to 'tm*' for argument '1' to 'time_t mktime(tm*)'
printf ("прошло секунд с начала эпохи юникс=%ld\n",zap_sec);
zap_data.tm_mon=zap_data.tm_mon-1;
printf ("исходная дата=%s, обработнная дата день=%d месяц-1=%d год=%d\n",date,zap_data.tm_mday,zap_data.tm_mon,zap_data.tm_year);
return 0;
}
Что бы сделать?
 
P

Pingvin1

Ответ - следует завести указатель и присвоить ему указание на структуру:
C++:
#include <stdio.h>
#include <ctime>
using namespace std;// cin cout \n \n

int main(int NumberofArgs, char* pszArgs[])	{
struct tm zap_data,*data_zap;
data_zap=&zap_data;
time_t zap_sec;
char date[11]="8.7.2014";
sscanf(date,"%d.%d.%d",&zap_data.tm_mday,&zap_data.tm_mon,&zap_data.tm_year);
time(0);
zap_sec=mktime(data_zap);//[Error] cannot convert 'tm' to 'tm*' for argument '1' to 'time_t mktime(tm*)'
printf ("прошло секунд с начала эпохи юникс=%ld\n",zap_sec);
zap_data.tm_mon=zap_data.tm_mon-1;
printf ("исходная дата=%s, обработнная дата день=%d месяц-1=%d год=%d\n",date,zap_data.tm_mday,zap_data.tm_mon,zap_data.tm_year);
return 0;								}
 
P

Pingvin1

В этом случае mktime возвращает ошибку -1.
 
R

rrrFer

Адский говнокод. Напиши словами чего ты хочешь получить.

Интересный ты чувак. Указал год, месяц и день и хочешь получить количество секунд.

В структуре tm есть еще часы, минуты и секунды (для дня который ты указал).
Если ты их не инициализируешь, то там хранится мусор типа -1216894744. Ну короче обычно там лежит большое отрицательное число, и видя это, mk_time кнешно дает ошибку (-1).

И ваще задачу пиши нормально. и Кончай писать говнокод, переменные называй по-человечески.

data_zap и zap_data - да ты че, издеваешься что-ли? Побереги свое зрение, не пиши так, никогда.
 
P

Pingvin1

Теперь работает. Кроме того, что надо обозначать все параметры, в структуре tm месяц хранится уменьшенный на единицу, а к году надо прибавлять 1900.
 
R

rrrFer

Pingvin1
но вы пишите если ченить еще будет не работать ))

Тока пиши сразу что пытаешься сделать и зачем. Код очень желательно нормально писать, вот эти zap_paz и paz_zap - это также плохо, как zap_I и zap_l. Согласись, что выглядят одинаково, для зрения это ваще не гуманно.
 
P

Pingvin1

> zap_paz и paz_zap - это также плохо
В конечной программе одну из этих переменных я поменял на uk_data.
 
R

rrrFer

Pingvin1
Да называйте переменные понятно.
uk - это united Kingdom?
или
uk - это Украина?

И так понятно что переменная хранит данные, приписка "_data" что то меняет?

Если вы хотели указать что там не данные, а дата - то надо было писать date. Это разные вещи.

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

Есть всякие книжки по "чистому коду", вот их можно почитать. У каждого автора свое мнение по этим вопросам, но они бы сошлись на том, что ваши имена сути не отражают и призваны запутывать ))
 
P

Pingvin1

Я только, что увидел это сообщение, написал по этому поводу в https://codeby.net/threads/32606

Для названий переменных я стал использовать Венгерскую нотацию.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!