Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
1

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

17.07.2012, 14:54. Просмотров 1529. Ответов 8
Метки нет (Все метки)

Это простой вопрос. Допустим такой код:
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)Делаю откат назад к корректной дате.

Зы:ну как-то так....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2012, 14:54
Ответы с готовыми решениями:

Статистика ошибок при выборе неправильного ответа
Здравствуйте. Программа для изучения математических формул. Есть кнопки для просмотра формул, и...

Обработка неправильного обращения к базе данных
При подключении к базе данных проверяю наличие соединения и при его отсутствии хотел бы выйти из...

Обработка неправильного url (mod rewrite)
Подскажите пожалуйста сирому, как правильно реализовать через .htaccess данное условие. Есть...

Обработка двумерного массива. Защита от неправильного ввода
Заполнить двумерный массив размерности n*m с клавиатуры только числами кратными 3, предусмотрев...

8
Модератор
Эксперт Python
26631 / 13884 / 2640
Регистрация: 12.02.2012
Сообщений: 22,756
Записей в блоге: 1
17.07.2012, 16:42 2
Чтобы не было таких ошибок, нужно предотвращать прямое присвоение. Сделай класс для даты и соотв. функции, которые будут анализировать данные перед присвоением. При возникновении ошибки - throw...
0
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
17.07.2012, 16:58  [ТС] 3
Цитата Сообщение от Catstail Посмотреть сообщение
Чтобы не было таких ошибок, нужно предотвращать прямое присвоение. Сделай класс для даты и соотв. функции, которые будут анализировать данные перед присвоением. При возникновении ошибки - throw...
Только так, да?.... , Как раз для такой задачи мне и надо (класс Дата), и конструктор принимающий три инта(день, месяц,год) .

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

Добавлено через 7 минут
Зы: в принципе если по другому ни как нельзя, то буду делать, но это выйдет так наляписто...
0
Модератор
Эксперт Python
26631 / 13884 / 2640
Регистрация: 12.02.2012
Сообщений: 22,756
Записей в блоге: 1
17.07.2012, 17:13 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]

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

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

ЗЫ:может получится разбить проверку на три метода типа года-месяц-число (приватными методами)......
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10832 / 6643 / 1613
Регистрация: 25.07.2009
Сообщений: 12,420
17.07.2012, 17:33 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 ) {
    /* ошибка */
}
1
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
17.07.2012, 17:38  [ТС] 7
alsav22, Не это совершенно не то. Я вроде как уже все выяснил с Catstail.

Добавлено через 3 минуты
easybudda, Если это будет работать то это круто, как я сам не догадался ведь как раз пользуюсь mktime();- опыта наверно мало.
0
5472 / 4867 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 17:48 8
Цитата Сообщение от tihonya Посмотреть сообщение
alsav22, Не это совершенно не то
Я уже понял. Поспешил.
0
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
17.07.2012, 18:38  [ТС] 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.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2012, 18:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Заполнения структуры в массив
Прошу Вас объяснить как мне правильно заполнить данный массив. не могу понять почему ошибка...

Структуры. Ошибка заполнения
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;conio.h&gt; using namespace std; string...

Функция класса заполнения структуры
Помогите пожалуйста, начал учиться С++, есть задание создать в функцию класса для заполнения...

Обработка заполнения таблиц
Добрый день. В очередной раз обращаюсь к профи за помощью. Помогите написать код. Есть две...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.