Sscanf And Mktime

Тема в разделе "Общие вопросы по С и С++", создана пользователем Pingvin1, 1 авг 2014.

  1. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Противоречие: функция sscanf работает с элементами структуры, если структура определена без звёздочки, а mktime нормально работает, если аргумент = структура определенна со *.
    Рабочий пример: 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;
    }
    Что бы сделать?
     
  2. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Ответ - следует завести указатель и присвоить ему указание на структуру:
    Код (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;                               }
     
  3. Pingvin1

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    В этом случае mktime возвращает ошибку -1.
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Адский говнокод. Напиши словами чего ты хочешь получить.

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

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

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

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

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Теперь работает. Кроме того, что надо обозначать все параметры, в структуре tm месяц хранится уменьшенный на единицу, а к году надо прибавлять 1900.
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Pingvin1
    но вы пишите если ченить еще будет не работать ))

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

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    > zap_paz и paz_zap - это также плохо
    В конечной программе одну из этих переменных я поменял на uk_data.
     
  8. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Pingvin1
    Да называйте переменные понятно.
    uk - это united Kingdom?
    или
    uk - это Украина?

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

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

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

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

    Pingvin1 Well-Known Member

    Регистрация:
    20 июл 2009
    Сообщения:
    50
    Симпатии:
    0
    Я только, что увидел это сообщение, написал по этому поводу в http://codeby.net/forum/threads/32606s120.html?start=120

    Для названий переменных я стал использовать Венгерскую нотацию.
     
Загрузка...
Похожие Темы - Sscanf And Mktime
  1. irbis-ru
    Ответов:
    2
    Просмотров:
    30
  2. Vander
    Ответов:
    8
    Просмотров:
    481
  3. ~~DarkNode~~
    Ответов:
    2
    Просмотров:
    678
  4. ~~DarkNode~~
    Ответов:
    17
    Просмотров:
    1.281
  5. ~~DarkNode~~
    Ответов:
    3
    Просмотров:
    490

Поделиться этой страницей