Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2011, 21:40   #1
_Mixer_
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 16
По умолчанию Исключения в Visual C++

Здраствуйте.

Вот код:

Код:
#include <iostream>
#include <string>
#include <excpt.h>
#include <stdlib.h>
using namespace std;

const int n = 3;  

class Train {
	
private:

	string destination;
	int train_number;
	float time;
	
public:

	int f_train_number();
	float f_time();
	string f_destination();
	void f_fill();
	void f_show();
	void Copy(Train &dest, Train src);

};

int Train::f_train_number()
{
	return train_number;
}

float Train::f_time()
{
	return time;
}

string Train::f_destination()
{
	return destination;
}

void Train::f_fill()
{

	cout << "Input destination" << endl;
	cin >> destination;
	
	
	__try{

	cout << "Input train number" << endl;
	cin >> train_number;

	}
	
	__except(EXCEPTION_EXECUTE_HANDLER)
	{

		train_number = 0;

	}

	__try{

	cout << "Input departure time" << endl;
	cin >> time;

	}
	
	__except(EXCEPTION_EXECUTE_HANDLER)
	{

		time = 0;

	}

}

void Train::f_show()
{
	cout << "Destination - " << destination << endl;
	cout << "Train number - " << train_number << endl;
	cout << "Departure time - " << time << endl;

}

void Train::Copy(Train &dest, Train src)
{

	dest.destination = src.destination;
	dest.time = src.time;
	dest.train_number = src.train_number;

}

void main()
{

	const n = 3;
	float t;

	Train tr[n];
	Train buf;
	
	for(int i = 0; i<n; i++)
		tr[i].f_fill();

	for (i=0; i<n-1; i++) 
		for (int k=0; k<n-1; k++) 
			if (tr[k].f_time() > tr[k+1].f_time()) 
			{
				buf.Copy (buf, tr[k]);
				buf.Copy (tr[k], tr[k+1]);
				buf.Copy (tr[k+1], buf);
			}

	for(i = 0; i<n; i++)
		tr[i].f_show();

	bool f = false;

	string destination;

	cout << "Input destination" << endl;
	cin >> destination;

	for (i=0; i<n; i++)
	{
			
		if (tr[i].f_destination() == destination) 
			{ 
				cout << "Train number " << tr[i].f_train_number() << " depart at " << tr[i].f_time() << endl;
				f = true;
			}
	}

	if (!f) cout << "There are no trains with such number" << endl;

	system ("pause");

}
Не пойму в чем дело.Не обрабатываются исключения(выделено красным).Когда намеренно ввожу символьные значения в train_number, nj то программа прекращает свою работу, не выдает никаких сообщений, а должна была бы присвоить 0 train_number.Помогите кто знает, что я не так сделал?

Последний раз редактировалось ACE Valery; 21.01.2011 в 23:25.
_Mixer_ вне форума Ответить с цитированием
Старый 19.01.2011, 21:44   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

ААА! Таже фигня была когда-то! Короче как мне обьяснили cin не генерирует исключение!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 19.01.2011, 21:46   #3
_Mixer_
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 16
По умолчанию

А как из ситуации выйти?
_Mixer_ вне форума Ответить с цитированием
Старый 19.01.2011, 21:47   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Ну можно считывать в строку! а потом atof, atoi!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 19.01.2011, 21:49   #5
_Mixer_
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
Ну можно считывать в строку! а потом atof, atoi!
Спасибо за совет, сейчас попробую)
_Mixer_ вне форума Ответить с цитированием
Старый 19.01.2011, 21:58   #6
_Mixer_
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 16
По умолчанию

Заменил код на вот этот, программа не останавливается, __except блоки не обрабатываются, может где-нибудь включить что-то нужно, хотя уже все что знал повключал((

void Train::f_fill()
{

char temp[5];

cout << "Input destination" << endl;
cin >> destination;
cout << "Input train number" << endl;
cin >> temp;

__try{
atoi(temp);
}

__except(EXCEPTION_EXECUTE_HANDLER)
{

train_number = 0;

}

cout << "Input departure time" << endl;
cin >> temp;

__try{

atof(temp);

}

__except(EXCEPTION_EXECUTE_HANDLER)
{

time = 0;

}

}
_Mixer_ вне форума Ответить с цитированием
Старый 19.01.2011, 22:11   #7
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

atof, atoi не генирирует исключения! это вам для того чтобы программа не вылетала!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 19.01.2011, 22:20   #8
_Mixer_
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 16
По умолчанию

А как можно сгенерировать исключение в данном случае?
_Mixer_ вне форума Ответить с цитированием
Старый 19.01.2011, 22:52   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Можно читать строку с помощью getline и самостоятельно проверять её корректность. Второй способ: включить генерацию исключения при ошибке чтения. Но следует учитывать, что ошибка возникает только в случае отсутствия цифр во входном потоке, то есть вот такое "334kdfd3" оно пропустит и считает 334.
Код:
#include <iostream>

using namespace std;

int main() {
    int number;
  
    cin.exceptions (ios::badbit | ios::failbit);
  
    try {
      cout << "Input number: ";
      cin  >> number;
    } catch (ios::failure& e) {
      number = 0;
    }
  
    cout << "Number is " << number << endl;
}

Последний раз редактировалось netrino; 19.01.2011 в 22:54.
netrino вне форума Ответить с цитированием
Старый 19.01.2011, 23:07   #10
_Mixer_
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 16
По умолчанию

Спасибо всем за помощь.
_Mixer_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключения не работают Syltan Общие вопросы по Java, Java SE, Kotlin 1 09.12.2010 09:17
Логарифм - Исключения[C++] ArniLand Общие вопросы C/C++ 2 04.05.2010 15:11
Исключения yurik1982 Фриланс 9 16.02.2010 00:34
Исключения Rifler Общие вопросы Delphi 5 12.11.2008 00:29
Оператор исключения Titan123 Общие вопросы Delphi 12 08.07.2008 14:30