Страница 1 из 1

генерация исключения

Добавлено: 26 мар 2011, 16:18
Евгений Александрович
Имеется: реализация сложения двух строк. В объединённой строке удаляю повторяющиеся символы ,если они есть, а иначе хочу сгенерировать исключение, что и делаю. Но почему оно не ловится?

Код: Выделить всё

class base
{
private:
	char* str;
	int size;
public:                              
	base(){size = 0; str = 0;}
    base( char *str1) 
	{ 
		size = strlen(str1);
		str = new char[size+1];
		strcpy(str,str1); 
	}
	base (const base &bs3);
	~base()
	{
		delete []str;
	}
	 void print() { cout<<str<<endl;}
	base operator + (base &bs);
	base &operator = (base &bs1);
};

base base: :o perator +(base &bs)
{
	base t;
	t.size = size + bs.size;
	t.str = new char [ t.size + 1 ];
	strcpy(t.str,str);
	if(strlen(strcat(t.str,bs.str)) > 20 ) throw 5;
int n=strlen(t.str);
for(int i=0;i < (n-1);i++)
{
if( t.str[i] == t.str[i+1])
	{
		for( int j=i; j < (n-1);j++)
			t.str[j] =t.str[j+1];
	t.str[n-1] = '\0';
	}
	else {float b=3.2;throw b;}
}
	return t;


}
base& base: :o perator =(base  &bs1)
{
	if(this != &bs1)
	{
		if(size != bs1.size)
		{
			delete []str;
			size = bs1.size;
			str = new char [ bs1.size + 1 ];
		}
		strcpy(str,bs1.str);
	}
	return *this;
}
base::base(const base &bs3)
{
	size = bs3.size;
	str = new char [ bs3.size +1 ];
	strcpy(str,bs3.str);
}
int main()
{
	char obj1[80],obj2[80];char obj3[80]; 
	try
	{
	cout<<" input:"<<endl;
	cin>>obj1;
	cin>>obj2;
	base s1(obj1),s2(obj2);
base s3;
	s3 =s1+s2;
	if(strlen(obj1) >10 || strlen(obj2) >10) throw err("\n leave for boards\n");
	s3.print();
	}
	catch( int arg ) { cout<<"\n so long"<<endl;}
catch( float arg ) { cout<<" without double symbols"<<endl;}
catch(err ob)
{
	cerr << ob.get_error();

}

	system("pause");
	return 0;
}

Re: генерация исключения

Добавлено: 26 мар 2011, 21:57
L.A.V.
Ух ты! Крутое месиво :cool: Кидать исключения на int и float. Жесть! Код стоило бы причесать(отформатировать для наглядности).

А теперь по делу.
Что выводит программа? Приведи тестовые последовательности и результат выполнения.
А потом расскажи, что хочешь чтоб выводилось при данных тестовых последовательностях. Идет?

Re: генерация исключения

Добавлено: 26 мар 2011, 23:42
Евгений Александрович
Программа складывает две введенные строки. В результирующей строке удаляются повторяющиеся символы. Но если их всеже не обнаружено - хочу сгенерировать исключение, написав :

Код: Выделить всё

if( t.str[i] == t.str[i+1]) 
    {
   ...
}
    else {float b=3.2;throw b;}
По идеии, его должен поймать соответствующий обработчик :

Код: Выделить всё

catch( float arg ) { cout<<" without double symbols"<<endl;}
Но исключение страбатывает в любом случае: не зависимо от того, введу я строки без повторяющихся символов, либо с повторяющимися.

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

[ATTACH]1450[/ATTACH]

Хотелось бы: исключение должно сработать только тогда, когда нету двойных символов.

Re: генерация исключения

Добавлено: 27 мар 2011, 01:12
L.A.V.
Ну тогда все понятно. Как я и предполагал, совсем не там проверку делаешь.
Могу предложить, в качестве решения, такой костыль. :)

Код: Выделить всё

base base: :o perator +(base &bs)
{
    base t;
    t.size = size + bs.size;
    t.str = new char [ t.size + 1 ];
    strcpy(t.str,str);
    if(strlen(strcat(t.str,bs.str)) > 20 ) throw 5;
    int n=strlen(t.str);
    // добавим флаг индикации того, что в строке присутствуют двойные символы
    bool isHasDoubleSymbols = false; 
    for(int i=0;i < (n-1);i++)
    {
        if( t.str[i] == t.str[i+1])
        {
            isHasDoubleSymbols = true; // ага, двойной символ
            for( int j=i; j < (n-1);j++);
                t.str[j] = t.str[j+1];
		
            t.str[n-1] = '\0';
        }
        // тут совсем не то место для твоей генерации
    }
    // а вот тут самое оно когда уже проверили всю строку
    if(!isHasDoubleSymbols) // если ни разу не встретили двойных символов
    {
        float b = 3.2; 
        throw b;       // кидаем исключалово
    }
    return t;
}
Теперь все должно работать так как ожидается.

Re: генерация исключения

Добавлено: 27 мар 2011, 16:10
Евгений Александрович
Точно! Огромное Вам спасибо!