обратно? Ну типа исправил косяк, можно дальше.
Что-то компилятор матерится, гад
>обратно? Ну типа исправил косяк, можно дальше.
> Что-то компилятор матерится, гадТы бы код показал.. А управление и так возвращается.
>>обратно? Ну типа исправил косяк, можно дальше.
>> Что-то компилятор матерится, гад
>
>Ты бы код показал.. А управление и так возвращается.
#include <iostream>
#include <string>using namespace std;
class error {} ;
int
main ()
{
try {
throw error () ;// а сюда хочу вернуться
cout << "I want here" << endl ;
}
catch ( ... ) {
// ну чё, goto что ли ?
}}
Можно и готу, но не надо)
Лучше вынести все в отдельный метод... и вызвать его ещё раз.
>обратно? Ну типа исправил косяк, можно дальше.
> Что-то компилятор матерится, гадникак.
// wbr
>>обратно? Ну типа исправил косяк, можно дальше.
>> Что-то компилятор матерится, гад
>
>никак.
>
>// wbr
Ибо, если такое дозволяется, это почти ничем не будет отличаться от
использования оператора goto.
>Ибо, если такое дозволяется, это почти ничем не будет отличаться от
>использования оператора goto.
Точно нельзя, даже на goto ругается, не компилит.
>
>>Ибо, если такое дозволяется, это почти ничем не будет отличаться от
>>использования оператора goto.
>
>
> Точно нельзя, даже на goto ругается, не компилит.
goto работает только в пределах блока, нельзя передать управление в другой
блок. Можно, в принципе, импользовать longjmp(), но это уже скобрёзный
разговор какой-то пошёл...
>блок. Можно, в принципе, импользовать longjmp(), но это уже скобрёзныйНет, конечно, нужно изменить логику самой программы.
А что такое "скобрёзный" ?
Т.е. я хочу сказать что нехорошо ругаться на бедного старого негра, масса Том, я же на вас не ругался :-)
>
>>блок. Можно, в принципе, импользовать longjmp(), но это уже скобрёзный
>
> Нет, конечно, нужно изменить логику самой программы.
>
> А что такое "скобрёзный" ?
>
> Т.е. я хочу сказать что нехорошо ругаться на бедного старого негра,
>масса Том, я же на вас не ругался :-)
Это я в смысле: не хорошо детям показывать картинки для взрослых.
Если задел, ишвиняюсь -- я по роду занятий чешусь от кривых детских ручек
на красных ядерных кнопках.
>Если задел, ишвиняюсь -- я по роду занятий чешусь от кривых детских
>ручек
>на красных ядерных кнопках.Ну не такие уж и детские, дядя Программер
http://beastie.ru/img/my_animals.jpgЯ этими ручками запросто вот такие вещи строю
http://coolsoft.ru/floppies/coolbsd.binИ в отличии от некоторых не прекращаю учиться и новому, и старому - чем заниматься была не судьба.
http://andr.ru/andr/anketa.htmlPS Так что ты не прав, Гнилой Помидор, у индейцев очень красивые имена.
;-))
>>Если задел, ишвиняюсь -- я по роду занятий чешусь от кривых детских
>>ручек
>>на красных ядерных кнопках.
>
> Ну не такие уж и детские, дядя Программер
> http://beastie.ru/img/my_animals.jpg
>
> Я этими ручками запросто вот такие вещи строю
> http://coolsoft.ru/floppies/coolbsd.binмммм.. мне трудно сказать, что содержится в этих бинарных файлах, но "дизайн" на www.coolsoft.ru оставляет желать очень много лучшего.. ;)
// wbr
>на www.coolsoft.ru оставляет желать очень много
Этот дизайн был сделан на буке P100/16Mb/HDD512, на которой стоял только Ворд.Нука-нука, попробуй
:-))
>
>>Ибо, если такое дозволяется, это почти ничем не будет отличаться от
>>использования оператора goto.
>
>
> Точно нельзя, даже на goto ругается, не компилит.
А как ругается? У меня вот это компилит:#include <iostream>
using namespace std;
int main () {
try {
throw(1) ;
XXX1:
cout << "I want here if 1" << endl ;
throw(2);
XXX2:
cout << "I want here if 2" << endl ;}
catch (int err ) {
switch (err) {
case 1: goto XXX1;
case 2: goto XXX2;
}
}}
gcc 2.95
>А как ругается? У меня вот это компилит:
>
>#include <iostream>
>
>using namespace std;
>
>int main () {
>
>try {
> throw(1) ;
>XXX1:
> cout << "I want here if 1" << endl ;
> throw(2);
>XXX2:
> cout << "I want here if 2" << endl ;
>
>}
>
>catch (int err ) {
> switch (err) {
> case 1: goto XXX1;
> case 2: goto XXX2;
> }
>}
>
>}
>
>
>gcc 2.95откомпилировать это может быть и можно, только вот работать оно по очевидным причинам не будет :)
// wbr
>>А как ругается? У меня вот это компилит:Не, ругается строго: отсюда делать туда goto нельзя.
У меня FreeBSD 5.3, gcc 3.4.2Да фигня, я по другому просто поток управления организую, уже не вопрос
Я просто по сишному привык по коду прыгать
Всем спасибо за советы
Прыгать по коду с jmp функциями - это не по сишному, это по придурошному.
Если Вы ещё не пришли к такому мнению - АХТУНГ!
>Прыгать по коду с jmp функциями - это не по сишному, это
>по придурошному.
>Если Вы ещё не пришли к такому мнению - АХТУНГ!Зик хайль!
>>А как ругается? У меня вот это компилит:
>>
>>#include <iostream>
>>
>>using namespace std;
>>
>>int main () {
>>
>>try {
>> throw(1) ;
>>XXX1:
>> cout << "I want here if 1" << endl ;
>> throw(2);
>>XXX2:
>> cout << "I want here if 2" << endl ;
>>
>>}
>>
>>catch (int err ) {
>> switch (err) {
>> case 1: goto XXX1;
>> case 2: goto XXX2;
>> }
>>}
>>
>>}
>>
>>
>>gcc 2.95
>
>откомпилировать это может быть и можно, только вот работать оно по очевидным
>причинам не будет :)
>
>// wbr
Еще как работает :)
>>откомпилировать это может быть и можно, только вот работать оно по очевидным
>>причинам не будет :)
>>
>>// wbr
>
>
>Еще как работает :)---cut---
class X;
try {
X x;
.....
l1:
.....
} catch (...) {
goto l1;
}
---cut---как вы себе представляете работу указанного кода?
при обработке исключения мы выходим за пределы области видимости блока try/catch -> экземпляр x уничтожается. что произойдёт по переходу goto? заново создастся x? а если это не предусмотрено логикой работы X? или как-то ещё?
// wbr
>при обработке исключения мы выходим за пределы области видимости блока try/catch -> экземпляр x уничтожается. что произойдёт по переходу goto? заново создастся x? а если это не предусмотрено логикой работы X? или как-то ещё?---cut---
#include <iostream>using namespace std;
class X {
public :
X() {
cout << "constructor" << endl;
};
~X() {
cout << "destructor" << endl;
};
};int
main()
{
try {
X x;
cout << "pre-label" << endl;
l1:
cout << "post-label" << endl;
} catch (...) {
cout << "handle exception" << endl;
goto l1;
}return 0;
}---cut---
$ g++ --version
g++ (GCC) 3.3.3 (NetBSD nb3 20040520)$ g++ -Wall test.cc -o xxx
test.cc: In function `int main()':
test.cc:22: error: jump to label `l1'
test.cc:26: error: from here
test.cc:20: error: skips initialization of `X x'
test.cc:26: error: enters try block..что собссно и следовало ожидать..
// wbr
>>>откомпилировать это может быть и можно, только вот работать оно по очевидным
>>>причинам не будет :)
>>>
>>>// wbr
>>
>>
>>Еще как работает :)
>
>---cut---
>class X;
>try {
> X x;
> .....
>l1:
> .....
>} catch (...) {
> goto l1;
>}
>---cut---
>
>как вы себе представляете работу указанного кода?
>
>при обработке исключения мы выходим за пределы области видимости блока try/catch -> экземпляр x уничтожается. что произойдёт по переходу goto? заново создастся x? а если это не предусмотрено логикой работы X? или как-то ещё?
>
>// wbr
>class X;
>try {
> X x;
> .....
>l1:
> .....
>} catch (...) {
> goto l1;
>}Чем что то представлять, лучше найдите gcc 2.95 и откомпильте им следующий код:
#include <iostream>
//take note - no namespace here
int main () {
class X {};
try {
X x;
throw(0);
l1:
cout << "Here me\n";
} catch (...) {
goto l1;
}
}Все нормально работает. А на gcc начиная как минимум с 3.2.x даже не откомпилится.
Речь не о том правильно это или нет, должно оно сработать или нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc 2.95 (возможно и gcc 3.0) то будет оно работать - только факт и ничего более.
>Чем что то представлять, лучше найдите gcc 2.95 и откомпильте им
>следующий код:давайте еще антиквариат навроде watcom 9 вспомним, там вообще все плющаво ;)
>#include <iostream>
>
>//take note - no namespace hereтаки нет. или вы указываете std:: явным образом [не указываете] или глобально через using.
ps: другой вопрос, что не все C++ компиляторы поддерживают пространства имен :) пример - Watcom C++ 9/10x. или кривый libc++ с глобальным пространством std. оба идут вопреки стандарту.
>int main () {
>
>class X {};
>
> try {
> X x;
> throw(0);
>l1:
> cout << "Here me\n";
> } catch (...) {
> goto l1;
> }
>}
>
>Все нормально работает.на основании чего вы сделали вывод, что это нормально работает?
в смысле запускается и не валится в core? это еще не показатель нормальной работы :) обратитесь к x после метки..> А на gcc начиная как минимум с 3.2.x
> даже не откомпилится.ugu, см. выще
>Речь не о том правильно это или нет, должно оно сработать или
>нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc
>2.95 (возможно и gcc 3.0) то будет оно работать - только
>факт и ничего более.с таким "тестированием" у вас на 99% и код с выходом за границы массива будет "нормально" работать :) ну в смысле не будет валиться. точнее, валиться будет, но редко..
// wbr
>давайте еще антиквариат навроде watcom 9 вспомним, там вообще все плющаво
>;)Да ничего я не собираюсь вспоминать. Еще раз повторю - просто привел факт, что на 2.95 оно откомилируется и будет работает.
>
>>#include <iostream>
>>
>>//take note - no namespace here
>
>таки нет. или вы указываете std:: явным образом [не указываете] или глобально
>через using.Хотел просто сказать, что gcc >= 3.2 в этом случае выдаст ошибку, и ничего более :)
>
>ps: другой вопрос, что не все C++ компиляторы поддерживают пространства имен :)
>пример - Watcom C++ 9/10x. или кривый libc++ с глобальным пространством
>std. оба идут вопреки стандарту.
>
>>int main () {
>>
>>class X {};
>>
>> try {
>> X x;
>> throw(0);
>>l1:
>> cout << "Here me\n";
>> } catch (...) {
>> goto l1;
>> }
>>}
>>
>>Все нормально работает.
>
>на основании чего вы сделали вывод, что это нормально работает?
>в смысле запускается и не валится в core? это еще не показатель
>нормальной работы :) обратитесь к x после метки..
>Работает так, как должно работать - правильно или нет, это уже другой вопрос
>> А на gcc начиная как минимум с 3.2.x
>> даже не откомпилится.
>
>ugu, см. выще
>
>>Речь не о том правильно это или нет, должно оно сработать или
>>нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc
>>2.95 (возможно и gcc 3.0) то будет оно работать - только
>>факт и ничего более.
>
>с таким "тестированием" у вас на 99% и код с выходом за
>границы массива будет "нормально" работать :) ну в смысле не будет
>валиться. точнее, валиться будет, но редко..
>
>// wbr
Какой вы нудный однако :))) Ну прежде всего, я так try/catch никогда не использую (мне даже в голову такое не приходило - использовать goto), но уж коль я сделал goto на метку в другом блоке, то я уж позабочусь, чтоб все было нормально. ПОДЧЕРКИВАЮ - я БЫ так никогда БЫ не сделал, но если БЫ возникла БЫ такая задача, то реализовать это с gcc 2.95 вполне возможно - и это просто ФАКТ И НИЧЕГО БОЛЕЕ.
P.S. Не надо мне больше объяснять, что дважды два четыре, please. ;-) Все что я хотел сказать, это то, что тот код откомпилируется и будет работать если использовать gcc 2.95 И НИЧЕГО БОЛЕЕ
>Какой вы нудный однако :))) Ну прежде всего, я так try/catch никогда
>не использую (мне даже в голову такое не приходило - использовать
>goto), но уж коль я сделал goto на метку в другом
>блоке, то я уж позабочусь, чтоб все было нормально. ПОДЧЕРКИВАЮ -
>я БЫ так никогда БЫ не сделал, но если БЫ возникла
>БЫ такая задача, то реализовать это с gcc 2.95 вполне
>возможно - и это просто ФАКТ И НИЧЕГО БОЛЕЕ.
>
>
>P.S. Не надо мне больше объяснять, что дважды два четыре, please. ;-)
>Все что я хотел сказать, это то, что тот код откомпилируется
>и будет работать если использовать gcc 2.95 И НИЧЕГО БОЛЕЕу нас видимо различные взгляды на термин "работает" :)
ps: к сожалению, я не могу так просто проверить "работоспособность" этой плюшки бо все доступные C++ компиляторы (gcc3.x, watcom 10.6, openwatcom 1.3) отказываются это даже собирать, а 2.95.3 слава богу уже практически канул в лета.
// wbr
>у нас видимо различные взгляды на термин "работает" :)
А задайте мне задачку с try/catch/goto (только чур без особых извратов), думаю я ее релизую на gcc 2.95 и будет работать как надо :)>
>ps: к сожалению, я не могу так просто проверить "работоспособность" этой плюшки
>бо все доступные C++ компиляторы (gcc3.x, watcom 10.6, openwatcom 1.3) отказываются
>это даже собирать, а 2.95.3 слава богу уже практически канул в
>лета.
>
>// wbrНу может тогда мне на слово поверите? Потому как я сначала проверил и только потом запостил.
gcc -v
gcc version 2.95.4 20011002 (Debian prerelease)
Если есть VMWare, то можно на виртулаьную машину посадить какой-нибудь старый(но не очень) дистр FreeBSD или Linux - занимает минут 15-20.
Господа!
Проблема решается очень просто!
Вместо 1 блока try надо сделать дваВот исправленный вариант ранее заявленой проги
#include <iostream>
#include <string>using namespace std;
class error {} ;
int
main ()
{
try {
throw error () ;
}
catch ( ... ) {
// исправили кривизну
}try {
// а сюда попали как хотелиcout << "I want here" << endl ;
}
catch ( ... ) {}
}
===============================Спорить не о чем, всё в шоколаде
> Спорить не о чем, всё в шоколаде
Эхехе... Да спор то (если это можно назвать спором) совсем не о том ;-)
>> Спорить не о чем, всё в шоколаде
>Эхехе... Да спор то (если это можно назвать спором) совсем не о
>том ;-)Тогда откройте другой топик, плз. А то мне ваш спор летит на мыло.
> Господа!
> Проблема решается очень просто!
> Вместо 1 блока try надо сделать два
>
> Вот исправленный вариант ранее заявленой проги
>
>#include <iostream>
>#include <string>
>
>using namespace std;
>
>class error {} ;
>
>int
>main ()
>{
>try {
> throw error () ;
>}
>catch ( ... ) {
> // исправили кривизну
>}
>
>try {
> // а сюда попали как хотели
>
> cout << "I want here" << endl ;
>}
>catch ( ... ) {
>
>}
>
>}
>===============================
>
> Спорить не о чем, всё в шоколаде
Ха! Если б всё так было просто.
Так нарушается едвали не главный принцип использования исключений: не
использовать их как управляющую конструкцию.
throw должен выбрасывать почти только ошибки, после которых действительно
нельзя продолжить. Вся идея try--catch в том, что деструкторы вызовутся
окуратненько, освободив все занятые ресурсы -- и только то.
А здесь именно управляющая конструкция.
Ветхий это код, батенька, -- в утиль его.
>Ха! Если б всё так было просто.
>Так нарушается едвали не главный принцип использования исключений: не
>использовать их как управляющую конструкцию.Не порите чушь, где вы видели "основную идею try-catch" ? Сошлитесь пжлста на авторитет, было бы удобно на стр. специального издания Страуструпа издательства БИНОМ 2004г, у меня оно.
Не знаю какая у разработчика была основная идея, а какая запасная, но try-catch - это именно управляющая конструкция и ничего более. Я бы сказал больше - очень удобная управляющая конструкция
>Ветхий это код, батенька, -- в утиль его.
Ну как хотите, у меня замечательно работает.
>>Ха! Если б всё так было просто.
>>Так нарушается едвали не главный принцип использования исключений: не
>>использовать их как управляющую конструкцию.
>
> Не порите чушь, где вы видели "основную идею try-catch" ?
>Сошлитесь пжлста на авторитет, было бы удобно на стр. специального издания
>Страуструпа издательства БИНОМ 2004г, у меня оно.
Это лучше всего изложено, помоему, у И.Пол.> Не знаю какая у разработчика была основная идея, а какая
>запасная, но try-catch - это именно управляющая конструкция и ничего более.
>Я бы сказал больше - очень удобная управляющая конструкция
Судя по всему, BASIC Вам больше подходит, чем C++.>>Ветхий это код, батенька, -- в утиль его.
> Ну как хотите, у меня замечательно работает.
Так и ладненько же. Только не показывайте никому, или не обижайтесь, когда
те, кто будут это читать ржать будут.
>Судя по всему, BASIC Вам больше подходит, чем C++.Дык в БАСИК try-catch как раз и нету! Это он вам больше подходит, раз вы его не хотите использовать.
>Так и ладненько же. Только не показывайте никому,
Ладно, никому не покажу, сам юзать буду>те, кто будут это читать ржать будут.
Топчите, драконьте, пингвинологи проклятые, виндоюзеры убогие, всё равно правда восторжествует и воцариться везде BSD-дъявол, аминь
Ну по другому напишу, если так не выйдет, всё равно напишу. От вас помощи, как от козла удой.
>>Судя по всему, BASIC Вам больше подходит, чем C++.
>
> Дык в БАСИК try-catch как раз и нету! Это он вам
>больше подходит, раз вы его не хотите использовать.
>
>>Так и ладненько же. Только не показывайте никому,
>
>
> Ладно, никому не покажу, сам юзать буду
>
>>те, кто будут это читать ржать будут.
>
> Топчите, драконьте, пингвинологи проклятые, виндоюзеры убогие, всё равно правда восторжествует и
>воцариться везде BSD-дъявол, аминь
>
> Ну по другому напишу, если так не выйдет, всё равно напишу.
>От вас помощи, как от козла удой.
Sorry, что опять влезаю. Мне кажется, что вы неэффективно используете try/catch и в вашем случае просто можно было обойтись конструкцией if else. Ниже упрощенный пример как я использую try/catch (Возможно меня сейчас тоже облажают с ног до головы :))#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <string.h>using namespace std;
class Error {
public:
Error(int acode, char * msg) {code=acode; strncpy(message,msg,sizeof(message)-1);}
void report(char *fname) {printf("Got error whil opening file '%s': %s (code=%i)\n",fname,message,code);}
int code;
char message[256];
};void fileopen(char *fname) {
FILE *f;
if (!fname) throw(Error(1000,"NULL name passed"));
if (!fname[0]) throw(Error(1001,"Zero length name passed"));
if (fname[0]<=32) throw(Error(1002,"Illegal first character in name"));
f=fopen(fname,"r");
if (errno) throw Error(errno,strerror(errno));
fclose(f);
}
int main() {
char fname[100];cout << "Enter fname: ";
cin.getline(fname,sizeof(fname)-1);try {
fileopen(fname);
printf("File '%s' succesfully open and closed\n",fname);
}
catch (Error e) {
e.report(fname);
}return 0;
}Здесь если использовать, if else, код, на мой взгляд, заметно осложниться.
>Все нормально работает. А на gcc начиная как минимум с 3.2.x
> даже не откомпилится.
>
>Речь не о том правильно это или нет, должно оно сработать или
>нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc
>2.95 (возможно и gcc 3.0) то будет оно работать - только
>факт и ничего более.собссно, что спорить, в стандарте на C++ явно сказано:
---cut---
INTERNATIONAL STANDARD ISO/IEC 14882
First edition 1998-09-016.1 Labeled statement [stmt.label]
1 A statement can be labeled.labeled-statement:
identifier : statement
case constant-expression : statement
default : statementAn identifier label declares the identifier. The only use of an identifier label is as the target of a goto. The scope of a label is the function in which it appears. Labels shall not be redeclared within a function. A label can be used in a goto statement before its definition. Labels have their own name space and do not interfere with other identifiers.
2 Case labels and default labels shall occur only in switch statements.
.........
6.6.4 The goto statement [stmt.goto]
1 The goto statement unconditionally transfers control to the statement labeled by the identifier. The identifier shall be a label (6.1) located in the current function.
---cut---ps: то, что это взято из достаточно старенького драфта, сути дела не меняет.
// wbr