Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65

Как правильно заполнять и изменять struct tm?

23.03.2019, 14:17. Показов 7308. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
почему при изменении tstruct2, меняется tstruct в этом коде?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    time_t now2 = time( NULL ) + 10800;
    struct tm *tstruct;
    tstruct = gmtime( &now );
    struct tm *tstruct2 = gmtime( &now2 );
    int32_t MaxDay = 0;
 
    if( tstruct->tm_mon == 0 || tstruct->tm_mon == 2 || tstruct->tm_mon == 4 || tstruct->tm_mon == 6 || tstruct->tm_mon == 7 || tstruct->tm_mon == 9 || tstruct->tm_mon == 11 )
        MaxDay = 31;
    else if( tstruct->tm_mon == 3 || tstruct->tm_mon == 5 || tstruct->tm_mon == 8 || tstruct->tm_mon == 10 )
        MaxDay = 30;
    else if( tstruct->tm_year % 400 == 0 || ( tstruct->tm_year % 100 != 0 && tstruct->tm_year % 4 == 0 ) )
        MaxDay = 29;
    else
        MaxDay = 28;
    cout << tstruct->tm_hour << endl;
    tstruct2->tm_hour = 19;
    tstruct2->tm_min = 0;
    tstruct2->tm_sec = 0;
    cout << tstruct->tm_hour << endl;
выводит
13
19
а не
13
13
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2019, 14:17
Ответы с готовыми решениями:

Как правильно использовать struct?
Написал небольшую, глупенькую программку, но столкнулся с проблемой заполнения структуры. Если kube.size вводит, то kube.color программа...

Как правильно объявлять struct переменную?
Как правильно объявлять? str one или struct str one; #include &lt;iostream&gt; using namespace std; struct str { int a; int b; ...

Как правильно заполнять robots.txt?
а как правильно заполнять роботс.тхт???

11
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.03.2019, 14:40
потому что gmtime() возвращает указатель на статический объект
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
23.03.2019, 15:00  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
time_t now = time( NULL ) + 10800;
    struct tm *tstruct;
    tstruct = gmtime( &now );
    struct tm *tstruct2;
    int32_t MaxDay = 0;
 
    if( tstruct->tm_mon == 0 || tstruct->tm_mon == 2 || tstruct->tm_mon == 4 || tstruct->tm_mon == 6 || tstruct->tm_mon == 7 || tstruct->tm_mon == 9 || tstruct->tm_mon == 11 )
        MaxDay = 31;
    else if( tstruct->tm_mon == 3 || tstruct->tm_mon == 5 || tstruct->tm_mon == 8 || tstruct->tm_mon == 10 )
        MaxDay = 30;
    else if( tstruct->tm_year % 400 == 0 || ( tstruct->tm_year % 100 != 0 && tstruct->tm_year % 4 == 0 ) )
        MaxDay = 29;
    else
        MaxDay = 28;
    cout << tstruct->tm_hour << endl;
    tstruct2->tm_year = tstruct->tm_year;
    tstruct2->tm_mon = tstruct->tm_mon;
    tstruct2->tm_mday = tstruct->tm_mday;
    tstruct2->tm_hour = 19;
    tstruct2->tm_min = 0;
    tstruct2->tm_sec = 0;
    cout << tstruct->tm_hour << endl;
а почему тогда тут выводит 14 13, а не 14 14
и как вообще инициализировать 2 структуры tm и правильно их заполнять параллельно?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.03.2019, 15:26
Цитата Сообщение от lallollulz Посмотреть сообщение
а почему тогда тут выводит
я не пойму как вы тут вообще используете не инициализированную переменную tstruct2

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    time_t now = time(NULL) + 10800;
    tm *tstruct;
    tstruct = gmtime(&now);
    tm tstruct2;
    int32_t MaxDay = 0;
 
    if (tstruct->tm_mon == 0 || tstruct->tm_mon == 2 || tstruct->tm_mon == 4 || tstruct->tm_mon == 6 || tstruct->tm_mon == 7 || tstruct->tm_mon == 9 || tstruct->tm_mon == 11)
        MaxDay = 31;
    else if (tstruct->tm_mon == 3 || tstruct->tm_mon == 5 || tstruct->tm_mon == 8 || tstruct->tm_mon == 10)
        MaxDay = 30;
    else if (tstruct->tm_year % 400 == 0 || (tstruct->tm_year % 100 != 0 && tstruct->tm_year % 4 == 0))
        MaxDay = 29;
    else
        MaxDay = 28;
    cout << tstruct->tm_hour << endl;
    tstruct2.tm_year = tstruct->tm_year;
    tstruct2.tm_mon = tstruct->tm_mon;
    tstruct2.tm_mday = tstruct->tm_mday;
    tstruct2.tm_hour = 19;
    tstruct2.tm_min = 0;
    tstruct2.tm_sec = 0;
    cout << tstruct->tm_hour << endl;
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
23.03.2019, 15:36  [ТС]
zayats80888, я сам не пойму, я сначала хотел заполнить нулями {0, 0....} но увидел что компилятор не ругается и оставил так, но вопрос в другом, как создать 2 структуры tm и изменять их как угодно?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.03.2019, 16:12
Лучший ответ Сообщение было отмечено lallollulz как решение

Решение

Вот эти структуры(tstruct1 и tstruct2) ты можешь использовать как угодно, так же обрати внимание как я реализовал чтение текущего времени(через функцию со статическим членом):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <ctime>
#include <iomanip>
 
using namespace std;
 
const time_t* now() {
    static time_t res;
    res = time(nullptr) + 10800;
    return &res;
}
 
int main()
{
    tm tstruct1 = *gmtime(now());
    cout << put_time(&tstruct1, "%c %Z") << endl;
    system("pause");
    tm tstruct2 = *gmtime(now());
    cout << put_time(&tstruct2, "%c %Z") << endl;
    system("pause");
}
1
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
23.03.2019, 16:33  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
так же обрати внимание как я реализовал чтение текущего времени(через функцию со статическим членом):
объясни, пожалуйста, зачем?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.03.2019, 16:47
Цитата Сообщение от lallollulz Посмотреть сообщение
объясни, пожалуйста, зачем?
что бы не нагромождать код, и передавать результат этой функции как параметр в gmtime(), если нужно считать текущее время в любой момент времени в ходе выполнения программы(если вам это конечно нужно).

Добавлено через 1 минуту
если же вам нужно это сделать только один раз, оставьте свой вариант, т.е.
C++
1
time_t now = time(NULL) + 10800;
1
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
23.03.2019, 16:57  [ТС]
zayats80888, сделал как вы указали, теперь вообще нельзя использовать указатели tstruct->tm_hour и прочие, как заполнять структуру?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.03.2019, 17:09
ну так это не указатели теперь, а именованные объекты, доступ к полям через точку(tstruct1.tm_hour), более того эти объекты можно безопасно копировать и инициализировать ими другие объекты:
C++
1
2
    tm tstruct3(tstruct1);
    tstruct2 = tstruct3;
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
23.03.2019, 17:53  [ТС]
спасибо за помощь
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.03.2019, 18:24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    time_t now = time(NULL) + 10800;
    tm tstruct = *gmtime(&now);
    int32_t MaxDay = 0;
    int32_t year = tstruct.tm_year;
    int32_t mon = tstruct.tm_mon;
    int32_t hour = tstruct.tm_hour;
 
    if (mon == 0 || mon == 2 || mon == 4 || mon == 6 || mon == 7 || mon == 9 || mon == 11)
        MaxDay = 31;
    else if (mon == 3 || mon == 5 || mon == 8 || mon == 10)
        MaxDay = 30;
    else if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        MaxDay = 29;
    else
        MaxDay = 28;
 
    tstruct.tm_hour = 19;
    tstruct.tm_min = 0;
    tstruct.tm_sec = 0;
 
    if (hour >= 19)
    {
        if (tstruct.tm_mday >= MaxDay)
        {
            tstruct.tm_mday = 1;
 
            if (tstruct.tm_mon == 11)
            {
                tstruct.tm_mon = 1;
                tstruct.tm_year++;
            }
            else
                tstruct.tm_mon++;
        }
        else
            tstruct.tm_mday++;
    }
 
    char buf[80];
    strftime(buf, sizeof(buf), "%a", &tstruct);
    string sDate = string(buf);
 
    while (sDate != "Mon" && sDate != "Tue" && sDate != "Thu")
    {
        if (tstruct.tm_mday >= MaxDay)
        {
            tstruct.tm_mday = 1;
 
            if (tstruct.tm_mon == 11)
            {
                tstruct.tm_mon = 0;
                tstruct.tm_year++;
            }
            else
                tstruct.tm_mon++;
        }
        else
            tstruct.tm_mday = tstruct.tm_mday + 1;
 
        time_t t = mktime(&tstruct);
        tstruct = *gmtime(&t);
        strftime(buf, sizeof(buf), "%a", &tstruct);
        sDate = string(buf);
        cout << sDate << endl;
        
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2019, 18:24
Помогаю со студенческими работами здесь

Подскажите, как правильно заполнять теги в картинке
В вордпресе. Чем отличается подпись от описания и атрибута альт? Если везде выберу одинаковую фразу, это будет как ошибка? Приведите...

Подскажите как правильно заполнять многомерный массив
почему может не работать так var bd_name_ar = Array('28', 'kod', 'raion', 'kod_tip', 'kod_mod', 'ser_num', 'inv_num', 'kod_02',...

Как правильно заполнять ListBox с неактивного листа?
Дано, лист 1: На нем в столбце А данные. (a1:a20) На листе 2 кнопка открывающая юзерформу с listbox. Как правильно подтянуть данные и...

Как правильно создать структуру (struct)?
Всем добрый день, Мне нужно просто создать струкутру, в который будет 3 значения: ip, login, password. Далее я ее буду использовать,...

Как правильно изменять свойства Model из ViewModel?
Есть модель с 10 свойствами. Есть VM так же с 10 свойствами, дублирующими модель. Есть (некое) хранилище модели, откуда можно её получить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru