Форум программистов, компьютерный форум CyberForum.ru

Обработка ошибок неправильного заполнения структуры tm? - C++

Восстановить пароль Регистрация
 
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 14:54     Обработка ошибок неправильного заполнения структуры tm? #1
Это простой вопрос. Допустим такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void main(){
int day=31, mon=5,year=82;
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
cout<<seconds<<endl;
timeinfo->tm_mday=day;
cout<<"Current Datetime:"<<asctime(timeinfo)<<endl;
timeinfo->tm_mon=mon;
cout<<"Current Datetime:"<<asctime(timeinfo)<<endl;
timeinfo->tm_year=year;
cout<<"Current Datetime:"<<asctime(timeinfo)<<endl;
}
Понятное дело, что как только я присваиваю не существующую дату в восьмой строке и обращаюсь к этой несуществующей дате в девятой прога вылетает.
Как мне отследить подобные ошибки и проинформировать пользователя о не корректных данных даты, и сделать корректное продолжение или выход из проги.

1)Я меняю структуру tm.
2)Обращаюсь к этой структуре.
3)Ловлю ошибку. (это мне и надо)
4)Делаю откат назад к корректной дате.

Зы:ну как-то так....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2012, 14:54     Обработка ошибок неправильного заполнения структуры tm?
Посмотрите здесь:

Обработка ошибок C++
Обработка исключений и ошибок C++
Обработка ошибок C++
C++ Обработка ошибок
Структуры. Ошибка заполнения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
17.07.2012, 16:42     Обработка ошибок неправильного заполнения структуры tm? #2
Чтобы не было таких ошибок, нужно предотвращать прямое присвоение. Сделай класс для даты и соотв. функции, которые будут анализировать данные перед присвоением. При возникновении ошибки - throw...
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 16:58  [ТС]     Обработка ошибок неправильного заполнения структуры tm? #3
Цитата Сообщение от Catstail Посмотреть сообщение
Чтобы не было таких ошибок, нужно предотвращать прямое присвоение. Сделай класс для даты и соотв. функции, которые будут анализировать данные перед присвоением. При возникновении ошибки - throw...
Только так, да?.... , Как раз для такой задачи мне и надо (класс Дата), и конструктор принимающий три инта(день, месяц,год) .

А как лучше реализовать алгоритм анализа входящих интовских значений((день, месяц,год) ? Неужели нужно расчет всего календаря в метод запихнуть?

Добавлено через 7 минут
Зы: в принципе если по другому ни как нельзя, то буду делать, но это выйдет так наляписто...
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
17.07.2012, 17:13     Обработка ошибок неправильного заполнения структуры tm? #4
Нет, зачем расчет календаря? Достаточно проверить правильность d, m, y.
Начинаешь с года (Y > 0). Проверяешь, високосный год или нет. Строишь массив длит. месяцев:

C++
1
int Mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
Если год високосный - Mon[2]=29;

Теперь проверяешь номер месяца m >=1 && m <= 12

А потом - проверка дня: d>=1 && d <= Mon[m]

Если все этапы пройдены - дата корректна...
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 17:29  [ТС]     Обработка ошибок неправильного заполнения структуры tm? #5
Ок буду так делать. Я именно это имел ввиду когда говорил "расчет календаря". Это я так криво написал.

Ладно проехали, просто нам показали ООП в программировании, и у меня большинство функций(методов) стали 1-2 строчки ) вообще чудес хочу, вот и изощряюсь глядя на свои предыдущие функции-динозавры

ЗЫ:может получится разбить проверку на три метода типа года-месяц-число (приватными методами)......
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.07.2012, 17:33     Обработка ошибок неправильного заполнения структуры tm? #6
Цитата Сообщение от alsav22 Посмотреть сообщение
if ( day < 1 || day > 30) std::cout << "NO!" << std::endl;
В году почти у половины месяцев 31 день. Да и не за чем такие велосипеды городить.
C
1
2
3
4
5
struct tm my_date_time;
/* заполнение структуры */
if ( mktime(&my_date_time) == -1 ) {
    /* ошибка */
}
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 17:38  [ТС]     Обработка ошибок неправильного заполнения структуры tm? #7
alsav22, Не это совершенно не то. Я вроде как уже все выяснил с Catstail.

Добавлено через 3 минуты
easybudda, Если это будет работать то это круто, как я сам не догадался ведь как раз пользуюсь mktime();- опыта наверно мало.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 17:48     Обработка ошибок неправильного заполнения структуры tm? #8
Цитата Сообщение от tihonya Посмотреть сообщение
alsav22, Не это совершенно не то
Я уже понял. Поспешил.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2012, 18:38     Обработка ошибок неправильного заполнения структуры tm?
Еще ссылки по теме:

C++ Написать функцию заполнения структуры случайными данными
Функция класса заполнения структуры C++
C++ Чтение числа из потока и обработка ошибок

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

Или воспользуйтесь поиском по форуму:
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 18:38  [ТС]     Обработка ошибок неправильного заполнения структуры tm? #9
easybudda, Не не работает, то-есть работает но очень странно. )
при использовании функции mktime(); оно как бы приводит дату к нужному виду.
то есть будет работать даже такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <ctime>
#include <time.h>
using namespace std;
void main(){
time_t seconds = time(NULL);
tm *timeinfo = localtime(&seconds);
cout<<seconds<<endl;
timeinfo->tm_mday=67;
timeinfo->tm_mon=05;
timeinfo->tm_year=82;
cout<<"Car day:"<<mktime(timeinfo)<<endl;
cout<<"Current Datetime:"<<asctime(timeinfo)<<endl;
cin.get();
}
И в последней строчке оно выведет 6 августа 1982 года .

Хотя и это можно использовать, сделать только примерную проверку (пример:день от 1 до 31) , а все несуразности, и мелкие выходы из диапазонов оно привет к виду )) все.

Добавлено через 22 минуты
Я тут еще подумал, можно сделать еще проверку на то изменилось ли значение в структуре tm по сравнению с исходными после функции mktime(); ели да то мы вышли за диапазон, ->возврат к исходному значению tm.
Yandex
Объявления
17.07.2012, 18:38     Обработка ошибок неправильного заполнения структуры tm?
Ответ Создать тему
Опции темы

Текущее время: 04:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru