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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
#1

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

17.07.2012, 14:54. Просмотров 806. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2012, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка ошибок неправильного заполнения структуры tm? (C++):

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

Структуры. Ошибка заполнения - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;conio.h&gt; using namespace std; string freq; int N = 0; struct...

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

Написать функцию заполнения структуры случайными данными - C++
Написать функцию заполнения структуры случайными данными. помогите...

Функция для диалогового заполнения данных структуры - C++
имеется вот такая структура #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; struct auto { int code; ...

Обработка ошибок - C++
Где почитать обработку ошибок при работе с текстовыми и бинарными файлами(считывание и запись),не в теории а конкретно на примерах...

8
Catstail
Модератор
22735 / 11104 / 1797
Регистрация: 12.02.2012
Сообщений: 18,300
17.07.2012, 16:42 #2
Чтобы не было таких ошибок, нужно предотвращать прямое присвоение. Сделай класс для даты и соотв. функции, которые будут анализировать данные перед присвоением. При возникновении ошибки - throw...
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 16:58  [ТС] #3
Цитата Сообщение от Catstail Посмотреть сообщение
Чтобы не было таких ошибок, нужно предотвращать прямое присвоение. Сделай класс для даты и соотв. функции, которые будут анализировать данные перед присвоением. При возникновении ошибки - throw...
Только так, да?.... , Как раз для такой задачи мне и надо (класс Дата), и конструктор принимающий три инта(день, месяц,год) .

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

Добавлено через 7 минут
Зы: в принципе если по другому ни как нельзя, то буду делать, но это выйдет так наляписто...
0
Catstail
Модератор
22735 / 11104 / 1797
Регистрация: 12.02.2012
Сообщений: 18,300
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
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 17:29  [ТС] #5
Ок буду так делать. Я именно это имел ввиду когда говорил "расчет календаря". Это я так криво написал.

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

ЗЫ:может получится разбить проверку на три метода типа года-месяц-число (приватными методами)......
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
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
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
17.07.2012, 17:38  [ТС] #7
alsav22, Не это совершенно не то. Я вроде как уже все выяснил с Catstail.

Добавлено через 3 минуты
easybudda, Если это будет работать то это круто, как я сам не догадался ведь как раз пользуюсь mktime();- опыта наверно мало.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 17:48 #8
Цитата Сообщение от tihonya Посмотреть сообщение
alsav22, Не это совершенно не то
Я уже понял. Поспешил.
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
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
17.07.2012, 18:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2012, 18:38
Привет! Вот еще темы с ответами:

обработка ошибок - C++
Есть класс треугольника, нужно, чтобы при вводе в конструктор нулей или минусовых значений вместо сторон, выдавало ошибку,получается...

Обработка ошибок - C++
void error(string s1, string s2) { throw runtime_error(s1 + s2); } int main() { setlocale(LC_ALL, &quot;ru&quot;); try { ...

Обработка ошибок - C++
while (1) { sh *newelem; newelem=new sh; cout&lt;&lt;&quot;Write number of the car&quot;&lt;&lt;&quot;\n&quot;; s=getch(); if (s=='*') ...

Обработка ошибок - C++
Есть главный класс и несколько дочерних, входящих как в состав главного, так и друг в друга (не важно) Нужно в другой класс передать члена...


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

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

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