Re[5]: Как выйти сразу из нескольких циклов?
От: March_rabbit  
Дата: 14.10.10 14:51
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>Здравствуйте, March_rabbit, Вы писали:


M_>>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.


B>А почему не сделать так:


B>
B>int длинный_и_тупой_алгоритм() {

B>    тупые_вычисления_1();
B>    if (шит_хаппен) goto приехали;

B>    тупые_вычисления_2();
B>    if (шит_хаппен) goto приехали;

B>    усё_в_упорядке();

B>приехали:
B>    return 0;
B>}
B>


B>?

ну, чисто на случай, если вариантов нужных действий окажется больше одного. Показалось, что делать метки и goto — это хуже, чем исключения.
Re: Как выйти сразу из нескольких циклов?
От: k.o. Россия  
Дата: 14.10.10 15:15
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?

Заворачивание нескольких циклов в итератор и один цикл с break по этому итератору. Извращенным этот способ делает, пожалуй, только сложность написания своих итераторов и отсутствие лямбд. В C# с LINQ это делается элементарно
Автор: dorofeevilya
Дата: 13.10.10
, в C++0x, наверно, тоже будет не так страшно.
Re[5]: Как выйти сразу из нескольких циклов?
От: stapter  
Дата: 15.10.10 08:03
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>А почему не сделать так:


B>
B>int длинный_и_тупой_алгоритм() {

B>    тупые_вычисления_1();
B>    if (шит_хаппен) goto приехали;

B>    тупые_вычисления_2();
B>    if (шит_хаппен) goto приехали;

B>    тупые_вычисления_3();
B>    if (шит_хаппен) goto приехали;

B>    тупые_вычисления_4();
B>    if (шит_хаппен) goto приехали;

B>    тупые_вычисления_5();
B>    if (шит_хаппен) goto приехали;

B>    усё_в_упорядке();

B>приехали:
B>    return 0;
B>}
B>


А почему бы "приехали" не сделать функцией? и использовать ее в связке с return?
Хотя, в данном примере даже функция не нужна. вместо goto приехали можно сразу return 0; или добавить переменную int result_code, оставив один return в конце и не забывая проверять ее перед каждым вычислением, — специально для тех кто придерживается идеологии одного return'a. //я не один из них

Вспомнил реальный случай. Студент хотел устроиться на работу, и ему дали несколько простых заданий, среди которых нужно было отсортировать массив. В его сортировке не было ни одного цикла реализованного с помощью for, while, do while (об stl даже не заикаюсь). Он сделал все на goto:
Спасибо ему за хорошее настроение целого отдела!

По теме делаю как говорил Erop "Ещё можно вложенные циклы в отдельный метод завернуть и выходить из него по return".
Сам, если вижу в коде goto начинаю испытывать чувство повышенной предосторожности. ИМХО и не только, "первым и единственным аргументом в пользу GOTO есть то, что другие операторы могут в 99% случаев заменить его с пользой для читабельности и структурированности", поэтому использовать его может и нужно, но только когда без этого уже никак не обойтись. Таких случаев на моей плюсовой практике еще не было. Интересно было бы посмотреть на реальные ситуации, когда без goto, ну уж совсем никак!
Re[6]: Как выйти сразу из нескольких циклов?
От: Brutalix  
Дата: 15.10.10 12:08
Оценка:
Здравствуйте, stapter, Вы писали:

S>А почему бы "приехали" не сделать функцией? и использовать ее в связке с return?


Там может быть какая нибудь хрень, которая, например, делает что либо с чем-нибудь локальным, которое пришлось бы передавать в эту функцию в качестве параметров. Или еще что нить.

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


S>Хотя, в данном примере даже функция не нужна. вместо goto приехали можно сразу return 0; или добавить переменную int result_code, оставив один return в конце и не забывая проверять ее перед каждым вычислением, — специально для тех кто придерживается идеологии одного return'a. //я не один из них


Есть такая бяка, называется, кодинг стандардз. В нем иногда пишут весьма странные вещи. И иногда их пишут как раз идеологи одного ретурна

S>Сам, если вижу в коде goto начинаю испытывать чувство повышенной предосторожности. ИМХО и не только, "первым и единственным аргументом в пользу GOTO есть то, что другие операторы могут в 99% случаев заменить его с пользой для читабельности и структурированности", поэтому использовать его может и нужно, но только когда без этого уже никак не обойтись. Таких случаев на моей плюсовой практике еще не было. Интересно было бы посмотреть на реальные ситуации, когда без goto, ну уж совсем никак!


По теме. я б осетра уменьшил и свечи потушил сказал — в 80% без идина можно пережить. еще в 10% можно изящно извратиться и обойтись без него. Но в 10% случаев с ним проще
Re[7]: Как выйти сразу из нескольких циклов?
От: Erop Россия  
Дата: 16.10.10 10:05
Оценка:
Здравствуйте, Brutalix, Вы писали:

B>Там может быть какая нибудь хрень, которая, например, делает что либо с чем-нибудь локальным, которое пришлось бы передавать в эту функцию в качестве параметров. Или еще что нить.

B>Вообще, так можно сделать. Но в некоторых случаях просто галимый идина проще

Можно сделать из функции класс, а локальные переменные сделать его полями...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Как выйти сразу из нескольких циклов?
От: Erop Россия  
Дата: 16.10.10 10:09
Оценка:
Здравствуйте, March_rabbit, Вы писали:

B>>О, мьсе понимает толк в извращениях!

M_>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.

длинный_и_тупой_алгоритм()
{
    ПараВействийПередВыходомДелатель doNotForgetDoIt;
    тупое_действие_возможно_содержащее_return_1();
    тупое_действие_возможно_содержащее_return_2();
    тупое_действие_возможно_содержащее_return_3();
    тупое_действие_возможно_содержащее_return_4();
    тупое_действие_возможно_содержащее_return_5();
    doNotForgetDoIt.Спасибо_ничего_не_надо();
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Как выйти сразу из нескольких циклов?
От: trophim Россия  
Дата: 16.10.10 21:27
Оценка:
Здравствуйте, Erop, Вы писали:

E>По goto за конец цикла и не страдать.


А на сколько при этом будет испорчена карма?
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Let it be! — Давайте есть пчелу!
Re: Как выйти сразу из нескольких циклов?
От: IROV..  
Дата: 16.10.10 21:57
Оценка: -1 :)
Здравствуйте, XJess, Вы писали:

#    define FOR_EACH2( type, i, j, i_begin, i_end, j_begin, j_end )\
    if( j_begin != j_end ) for( type i = i_begin, j = j_begin; i != i_end? true: (++j != j_end? i = i_begin, true : false); ++i )


    FOR_EACH2( int, i,j, 0,10,0,10)
    {
        printf("%d,%d\n",i,j);
    }


писать циклы вот так )))
я не волшебник, я только учусь!
Re[3]: Как выйти сразу из нескольких циклов?
От: Sni4ok  
Дата: 16.10.10 23:04
Оценка:
Здравствуйте, trophim, Вы писали:

T>А на сколько при этом будет испорчена карма?


карма испортится, если человек будет просаживать производительность на пустом месте.
Re[3]: Как выйти сразу из нескольких циклов?
От: Erop Россия  
Дата: 18.10.10 06:08
Оценка:
Здравствуйте, trophim, Вы писали:

E>>По goto за конец цикла и не страдать.

T>А на сколько при этом будет испорчена карма?

Это зависит от намерений и умений посылающего
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Как выйти сразу из нескольких циклов?
От: Nik_1 Россия  
Дата: 18.10.10 10:21
Оценка: +1 -2
Здравствуйте, IROV.., Вы писали:
IRO>да я гдето видел написаный на ООП "Hello World"
IRO>не кажеться что всему свое место? и не стоит все под одно "чисать"

А что внем такого ужасного увиде Или утя какойто неправильный хелловорд был

class CMyApp : public CApp
{
public:
  virtual int Run()
  {
    console.print("Hello World");
    return 0
  };
};

че внем такого ужасного
Re[8]: Как выйти сразу из нескольких циклов?
От: March_rabbit  
Дата: 18.10.10 10:29
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Brutalix, Вы писали:


B>>Там может быть какая нибудь хрень, которая, например, делает что либо с чем-нибудь локальным, которое пришлось бы передавать в эту функцию в качестве параметров. Или еще что нить.

B>>Вообще, так можно сделать. Но в некоторых случаях просто галимый идина проще

E>Можно сделать из функции класс, а локальные переменные сделать его полями...

1. Лишние телодвижения (объявление класса, мемберов, конструктора, оператора скобки)
2. Вынос логики наружу из места использования (именно поэтому я предпочитаю использовать макросни типа Q_FOREACH вместо STL, где это возможно).

И все это только для того, чтобы избавиться от goto или лишнего бросания исключения? Стоит ли оно того?
Re[9]: класс-механизм
От: Erop Россия  
Дата: 18.10.10 10:42
Оценка:
Здравствуйте, March_rabbit, Вы писали:

M_>И все это только для того, чтобы избавиться от goto или лишнего бросания исключения? Стоит ли оно того?

Только ради goto не стоит, конечно. Я вроде бы прямо так и советовал по goto выходить и не страдать.
Но у подхода класс-механизм
Автор: Erop
Дата: 26.08.05
есть и другие плюсы!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Как выйти сразу из нескольких циклов?
От: chrisevans  
Дата: 18.10.10 15:20
Оценка: 18 (1) :))
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?

1. Сохранить текущее состояние в файл.
2. Перезагрузить компьютер.
3. Запустить программу при загрузке ОС.
4. Восстановить состояние из сохраненного файла.
Re[5]: Как выйти сразу из нескольких циклов?
От: March_rabbit  
Дата: 20.10.10 10:27
Оценка: -1 :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, March_rabbit, Вы писали:


B>>>О, мьсе понимает толк в извращениях!

M_>>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.

E>
E>длинный_и_тупой_алгоритм()
E>{
E>    ПараВействийПередВыходомДелатель doNotForgetDoIt;
E>    тупое_действие_возможно_содержащее_return_1();
E>    тупое_действие_возможно_содержащее_return_2();
E>    тупое_действие_возможно_содержащее_return_3();
E>    тупое_действие_возможно_содержащее_return_4();
E>    тупое_действие_возможно_содержащее_return_5();
E>    doNotForgetDoIt.Спасибо_ничего_не_надо();
E>}

1. убрать скобки за тупыми действиями, а то return никуда не выйдет
2. убрать метод "Спасибо_ничего_не_надо" и перенести его контент в деструктор класса ПараВействийПередВыходомДелатель (чтобы само делалось)

3. часть логики выпадает из места, где она имеет какой-то смысл.
4. трудности с локальными переменными
Re[6]: Как выйти сразу из нескольких циклов?
От: rusted Беларусь  
Дата: 20.10.10 11:17
Оценка: +1
Здравствуйте, March_rabbit, Вы писали:

M_>2. убрать метод "Спасибо_ничего_не_надо" и перенести его контент в деструктор класса ПараВействийПередВыходомДелатель (чтобы само делалось)


Я так понимаю, что Спасибо_ничего_не_надо — это как раз сигнал того, что в деструкторе ничего не надо делать. Т.е. в случае ошибки и return-а из середины функции деструктор как раз все что нужно сделать при ошибке сделает, а в случае успешного выхода эти дейсвия не нужны и Спасибо_ничего_не_надо просто выставляет соответсвующий флаг.
Re[4]: Как выйти сразу из нескольких циклов?
От: Vain Россия google.ru
Дата: 20.10.10 13:22
Оценка:
Здравствуйте, okman, Вы писали:

B>>О, мьсе понимает толк в извращениях!

O>Извращение — писать большущие конструкции с вложенными циклами,
O>а потом думать как из них вылезти.
Месье знает как писать без вложенных циклов?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Как выйти сразу из нескольких циклов?
От: Vain Россия google.ru
Дата: 20.10.10 14:23
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
Вброшу и свои заготовки: http://codepad.org/zzGcnfwg
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Как выйти сразу из нескольких циклов?
От: uzhas Ниоткуда  
Дата: 20.10.10 14:35
Оценка:
Здравствуйте, Vain, Вы писали:

V>Вброшу и свои заготовки:

http://codepad.org/wPDtwwBP
Re[3]: Как выйти сразу из нескольких циклов?
От: Vain Россия google.ru
Дата: 20.10.10 14:37
Оценка:
Здравствуйте, uzhas, Вы писали:

V>>Вброшу и свои заготовки:

U>http://codepad.org/wPDtwwBP
Это к чему?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.