Re[10]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 04.06.02 08:20
Оценка: 277 (25) +2
Здравствуйте Patalog, Вы писали:

P>:no: :no: :no: :no: :no: :no:

P>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
P>Тк в оригинале при "Юзер попытался исправить ошибку" цикл начнется заново, а в вашем случяе продолжиться.

:) Самое интересное, что этот факт тоже можно истолковать двояко. goto сделало твой код настолько непонятным, что Влад со второго раза не может переписать его правильно. Вывод однозначен — goto несёт вред. Давить! ;)

Собственно, я вмешался, так как хочу выступить в защиту goto. Влад говорил, что первая двадцатка топа его поддержит. Ну, я уже давно из неё выбыл, так что мне можно. ;)


Итак.

Во-первых, мне не совсем понятно, почему для противники goto постоянно щеголяют приёмами из арсенала C++. Если goto противоречит принципам структурного программирования, давайте оперировать средствами языка C. То есть никаких исключений, объектных обёрток и пр.

Во-вторых, по поводу стиля. Для меня стиль — это не набор конкретных правил. Это скорее возведённый во главу угла принцип писать програмы, понятные другим. Всё остальное — лишь средства для достижения цели, которые, однако, могут быть использованы и во вред. Мы все широко и с удовольствием используем break для выхода из цикла. Чем отличается goto для выхода из вложенного цикла? Практически ничем. Кстати, в Java goto убрали, но расширили синтаксис break для выхода из вложенных циклов. Похоже, ребята рассуждали похожим образом.

В-третьих, по поводу других предложенных методов.
1. Вспомогательная функция+выход по return. Поскольку функции по правилам C могут находиться в любом месте программы (в т. ч. в другом модуле), читателю совершенно непонятно, куда приведёт return. Эту ситуацию можно немного поправить, структурируя код и добавляя комментарии, но это не меняет сути — такой подход не способствует читабельности.
2. Вспомогательные переменные и проверки. Конечно, это субъективно, но на мой взгляд они более непонятны для читателя. И чем глубже вложенность, тем ситуация хуже. Логически выход осуществляется в том месте, где мы измегняем условие выхода, но фактически выход осуществляется где-то в другом месте (возможно, несколькими страницами выше/ниже). Читабельности это не способствует.

Проблема в том, чтоь вложенные циклы со сложной логикой выхода — конструкция сама по себе не очень очевидная. Я согласен, что если программу можно перепроектировать и избавиться от них, то это нужно сделать. Но это возможно не всегда.

В-четвёртых, по поводу квалификации программиста и зависимости количества goto от неё. Смеха ради я открыл папку VC6 и сделал по ней глобальный поиск. Что же я вижу? MFC. goto используются во многих местах. Ну, я всегда подозревал, что MFC писали ламеры. Смотрим дальше. CRT. Что это? И здесь goto? Список кандидатов на увольнение из Микрософт разрастается... Но ведь есть же ATL. Её писали настоящие ООП-пацаны, они не могут нас подвести. Как, и здесь goto? :???: Поистине, мы живём в обществе потребления, без веры, без идеалов... ;) Список можно продолжать. Загляните в исходники ядра Linux. Там вы тоже найдёте goto. Почему Linux-комьюнити до сих пор не переписала этот позорный код? Ы? Вот и я о том же.

В-пятых, по поводу принципов. Лично я не видел ни одного бесспорного принципа в программировании. Да и вообще по жизни. Структурное программирование, ООП, обобщённое программирование — замечательные вещи, но их принципы работают не всегда. Помнится, Влад сам развлекался, описывая всеохватную припверженность создателей Java принципам ООП. Так о чём теперь спор? Что из правила не может быть исключений? Помилуйте, это история не из реального мира.

В-шестых, по поводу важности характеристик программ. Тут назвали уже корректность, эффективность по скорости и по памяти, понятность для других, поддерживаемость, расширяемость, переиспользуемость и т. д. В этом вопросе, как мне кажется, каждый смотрит со своей колокольни. Понятно, что корректность как главное качество программы под сомнение не ставится. Но те, кто разрабатывает приложения для enterprise, упирают на поддерживаемость/расширяемость. А те, кто занимается реальным временем, встроенными системами и т. п., будет упирать на эффективность. Мне удалось поработать и там, и там, и я полностью согласен со всеми аргументами. Я видел очень важные, полезные программы, которые были абсолютно нечитабельными (в частности, из-за массы #ifdef/#endif для подержки различных аппаратных платформ). Расскажите фирме, что они дураки, когда они уже заработали на этой программе мегабаксы. Словом, важность отдельных параметров зависит от конкретного проекта. Так было, и так будет.

Ну и последнее. По поводу надуманности примеров, где goto реально помогает. На мой взгляд, даже в Windows-программировании такие случаи бывают. Вот самый что ни есть типичный сценарий (напоминаю, пока мы остаёмся в рамках C):

void foo()
{
   HANDLE hFile = NULL; // Файл
   HANDLE hFileMapping = NULL; // Отображение
   LPVOID pMappedBuffer = NULL; // Буфер для работы с отображением
   char *pBuf = NULL; // Целевой буфер
   BOOL bResult = TRUE;

   // Открываем файл
   // Создаём отображение
   // Мапим
   // Копируем содержимое файла в буфер
   // Работаем с данными

failure:
   bResult = FALSE;

cleanup:

   if(pBuf != NULL)
      delete [] pBuf;
   if(pMappedBuffer != NULL)
      UnmapViewOfFile(pMappedBuffer);
   if(hMapping != NULL)
      CloseHandle(hMapping);
   if(hFile != NULL)
      CloseHandle(hFile);

   return bResult;
}


Да, в C++ это решается с помощью исключений. Но исключения — палка о двух концах. Во-первых, не все пишут на C++ (некоторые на C). Во-вторых, бывают разные платформы. Я сейчас пишу для Windows CE, так вот здесь исключения C++ вместе с RTTI не поддерживаются. Не поддерживаются, и всё тут. В-третьих, любители жить без CRT тоже не очень-то жалуют исключения (и ATL/WTL вполне поддерживают такой стиль жизни).

Можно приводить и другие примеры. Про встроенные/низкоуровневые системы, которые с основном пишутся на C, тут уже сказали, и я с этим согласен. Другой характерный пример — портирование. Когда портируешь, скажем, сложную вычислительную программу с Фортрана (а они испещрены goto), лучше всего не ломаться и перенести все goto без изменений (проверено практикой). Иначе вероятность внести ошибку огромна, а проверить возможности нет никакой (большинство goto — это какие-то вырожденные случаи алгоритма, и если он сложен, нужный набор исходных данных фиг подберёшь). Впрочем, последний пример — это и иллюстрация недостатков goto при их повсеместном применении (как это было в фортране).

Резюме. Я призиваю участников этого флейма не быть такими категоричными. Эту ветку могут читать начинающие. Не надо прессовать им мозги "незыблемыми правилами". Лучше поучите их думать головой.

PS. "Правила игры", принятые в некоторой фирме (всяческие styleguide'ы и пр.), следует уважать. Большие программы создаются большими коллективами. Хотя умение работать в команде не имеет прямого отношения к квалификации программиста, это важнейшая вещь. Этому нужно учиться. Чего себе и вам желаю.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[7]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 04.06.02 13:42
Оценка: 123 (11)
Здравствуйте Patalog, Вы писали:

IT>>Главная оценка качества кода — maintenance...


P>Т.е. производство ради производства?


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

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


Не приходило. Более того, пока ты пишешь программу ты её сам и изменяшь. Или ты никогда не возвращаешься к уже написанному коду? Типа открыл тетрадку начал писать, закончилась тетрадка пошёл сдал результат заказчику? Ну-ну.

P>Ты всегда "офисный" софт пишешь? Тогда, конечно, узеру всегда приятно видеть пару лишних фенечек. А как насчет, что софт иногда пишется под конкртное железо (или ето уже не модно)?


Не важно подо что пишется софт, под железо или под юзера. Завтра ты получаешь новую версию железа и что, будешь писать под неё софт с нуля или доработаешь предыдущую версию программы? Если она монолитная и неизменяемая и не позволяет добавить пару новых фич, то наверное первое. Дорогой ты получается разработчик для своего работодателя. Тебе бы за эту переделку заплатить как за доработку, а не новую разработку, сразу бы всё стало понятно.

P>А maintenance, как ты выразился, в большинстве софтверных контор вырождается в убирание багов уже после релиза.


Правильно. Полтора года назад сидел я одном доткоме и правил баги. Первое с чего всё начиналось — это с преведения исходного кода в божеский вид, расстановки отступов, добавления пробельных строк между процедурами и т.д. На это уходило больше времени чем на исправление самих багов. Этот дотком платил за меня моему работодателю 80 баксов в час, $640/день, $3200/неделю, $14000/месяц. Половиной этих денег оплачивалось форматирование исходных кодов. После того как пара таких самородков, за которыми всё время приходилось убирать ушли, было принято Code Convention и дело пошло на лад. Правда самому доткому уже не долго оставалось жить.

IT>>Это всё важно, но вторично.


P>Еще раз повторюсь, есть вещи в которых _ЭТО_ первично. А вот модное слово maintenance вторично, либо совсем не нужно.


Ты говоришь как типичный одиночка, никогда не работавший в команде, тем более в большой. Мне вот и сейчас приходится проводить работу с молодыми и втолковывать им, мол ребята, расслабьтесь, если ты работаешь в команде и на дядю, то твой код тебе не принадлежит. Он пренадлежит команде и дяде. Открывай свою контору и хоть оппишись goto, можешь нанять программистов и заставить их тоже так писать, флаг в руки. А ещё потребуй от них чтобы они тебе наколбасили кода, который бы невозможно было понять другому человеку и повторно использовать. А если они не дай бог вздумают своевольничать и писать универсальные классы и процедуры, да ещё и без goto, то всех лешить премии и уволить.

ЗЫ. Знаешь почему на RSDN'е так медленно появляются новые фичи? В том числе и потому, что если мне нужно что-то добавить в исходнике, с которым мне не приходилось ещё работать, то для начала я должен его переписать по новой. При этом я уважаю Диму, который всё это делал, как талантливого программиста, но была бы моя воля я бы отшлёпал это юное дарование за то, что он видимо как и ты считает maintenance просто модным словом и оно для него "вторично, либо совсем не нужно".
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Выйти из двух циклов сразу
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.06.02 01:38
Оценка: 60 (5) +1 -1 :)
Здравствуйте WolfHound, Вы писали:

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


DG>>Интересно, почему мне намного больше нравится следующий код?

WH>А мне нет особенно после того как я вспоминаю про скрытый код о котором (кроме интерфейса) я ни чего не знаю.
DG>>И почему очень не нравится предыдущий код, особенно, если бы его писал мой подчиненный...
WH>И почему-бы я не стал работать на босса которого интересует как выглядит мой код, а не то как он работает.
Громко смеюсь. Я вот тут как бы работаю этаким чем-то вроде босса среднего звена. Если не смотреть в код и не иметь правил оформления, то даже корректные программы в проекте с числом участником более двух начинают... как бы это сказать... Коэффициент дублирования кода возрастает в разы, равно как и процент изменений на каждый апдейт... Множатся длинные куски закомментированного кода... Который остался от предыдущего автора, но поскольку он пишет в своем стиле, то его проще убить чем понять...

Для справки приведу список ситуаций, за которые я могу блин нахер уволить, несмотря на корректность' программы:
1. Многократное использование явных констант в коде.
2. Независимое использование зависимых констант в коде
3. Написание фрагментов кода с избыточностью более чем в 3 раза
4. Написание собственных классов, дублирующих одобренные к применению библиотеки
5. Применение оператора goto без аргументированного объяснения причин, по которым он абсолютно необходим.
6. ...
'примечание: под корректностью программы понимается ее способность получить правильные результаты на оговоренных тестовых задачах
И буду прав, потому что код человек пишет для того, чтобы им пользовались другие, а не для того чтобы компилер смог его скомпилять. И если человек написал код, за который ему платят деньги, то он должен и отдать код, а не екзешник.
Так что код подчиненных я смотрел, смотрю, и буду смотреть, чтобы меньше увольнять пришлось — так у меня хоть возможность есть вовремя вежливо указать человеку на его ошибки.

DG>>ИМХО, с таким стилем кода сложно писать большие приложения.

WH>Просто особенно после того как автокомментирование врубается. :))
У меня складывается личное очучение что большинство народа в этой тусовке никогда не работало в команде :)
Ребята, я может какой-нибудь там этот... оппортунист... или конформист... как там меня однажды обозвали... Короче, я вот как-то верю в большинство общепринятых концепций, в основном потому, что практика показывает их истинность. Так вот, в хорошей программе комментариев должно быть МАЛО. Если приходится каждый пук автокомментировать, то это означает, что по коду не удается однозначно восстановить алгоритм. Далее, поскольку комменты жрут место, то программа распухает, и характерная "длина когерентности" тоже вместе с ней, затрудняя понимание еще сильнее. Теперь придется еще комментов подбавить, чтобы например понять, чей это елзе или закрывающая скобка... Вот вам и пестня...
Так что будьте проще. Пишите для людей.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 07:17
Оценка: 18 (1) :))) :)))
Здравствуйте, S.Yu.Gubanov, Вы писали:

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


J>>предлагаешь объявлять функцию с 20 аргументами?


SYG>Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.

SYG>Варианты решения этой проблемы не уменьшающие быстродействия программы:
SYG>1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.
SYG>2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.
SYG>3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.

-- Хвала оберону!!!Джихад неверным!
Но однажды на пути войнов оберона стали войны функциональных языков
-- Да мы за функциональные языки всех на ремни порвем!
А потом подтянулись войны дотнета
-- Сила в доднете! Пусть мы погибнем, но мы погибнем, как герои. ЗА ДОТНЕТ В АТАКУ!!!!!!!

И никто никому не хотел уступить. И начался бой... Кровавый бой... беспощадный...
И когда битва дошла до небес, великий Гейтс увидел, что силы равны. И если не остановить бой, погибнут все. И он остановил бой.




Смотрите в кинотеатрах, новый блокбастер: ПлюсПлюс Дозор

ПлюсПлюс Дозор. Всем выйти из фреймворка!

... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[12]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 03.06.02 19:27
Оценка: 33 (5) :)
Здравствуйте VladD2, Вы писали:

VD>Слушай! А как может называться стиль главным достоинством которго является использование goto? И как вообще использование goto можно назвать стилем?


Когда-то очень давно я видел в каких-то исходниках что-то типа такого goto (за точность не ручаюсь):

goto ForgiveMeGuysICannotBelieveIDidIt;
...
ForgiveMeGuysICannotBelieveIDidIt:
...


Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 03.06.02 20:41
Оценка: 36 (4)
Здравствуйте WolfHound, Вы писали:

WH>И в обще для оценки качества кода есть 3 простых критерия:


Главная оценка качества кода — maintenance, т.е. сопровождаемость и первое правило, которого нужно придерживаться — это то, что твой код будут читать и возможно править другие программисты. При этом некоторые из них менее опытные и будут тебя материть за непонятность и запутанность кода, а некоторые более опытные будут материть тебя за то же самое, но уже по другому.
Иногда встречаются такие программы, которые можно назвать монолитными. Не потому что они стройные и красивые, а потому что они неизменяемые и повторно неиспользуемые. Для того чтобы в них добавить хоть одну фичу их можно только полностью переписть, при этом перечисленным тобой ниже оценкам они вполне удовлетворяют, но ценность у них никакая для будущих поколений. Все твои goto как раз и делают программу монолитной и неизменяемой. Тому кто будет идти за тобой придётся твой код переделывать полностью. Понятное дело, что писать такие программы много ума не надо, а вот попробуй написать так, чтобы тот кто открыл твой текст сразу бы уведел место куда можно добавить свой кусочек и не тратил бы часы на выискивание меток и их вызовов.

WH>1)Наличие ошибок

WH>у вас покрайней мере одна
WH>2)Скорость работы
WH>эксепшены и вызовы процедур ее не увеличивают
WH>3)Затраты памяти
WH>у вас хоть не на много но больше

Это всё важно, но вторично.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.05.02 13:33
Оценка: 11 (4)
Здравствуйте slonnik, Вы писали:

S>А если не cекрет а почему именно ВТОРОЙ exception и в чем его отличие от первого


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

Рассмотрим, пример:
//есть класс A, деструктор которого кидает исключение Exception2;
struct A
{
  ~A() {throw Exception2();}
};
//есть сервер, который кидает исключение
void Server()
{
  A a;
  throw Exception1();

}

//и есть клиент, который их ловит
void Client()
{
  try
  {
    Server();
  }
  catch (...)
  {
  }
}


Так вот, если при размотке стека при обработке исключения Exception1, окажется, что сгенерировалось еще одно исключение Exception2, которое ловится "выше", чем генериется первое, то у компилятора возникает дилема, какое исключение из этих двух передать в catch. В C++ пошли наиболее простым путем, и грохают всю программу(что очень сильно мешает написанию устойчивых программ), в остальных языках(Java, C#) второе исключение просто игнорируется.

Рассматривать программу, как дерево, и проведем линии от возникновений исключений до их обработки. Если линии сливаются, то в этом случае программа будет завершена.
Re[3]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.05.02 10:56
Оценка: 6 (1) +1 -1 :)
Здравствуйте Mishka<T>, Вы писали:


MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.


Не пугай так народ, от и так уже запуганный.

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

Так что выход из вложенного цикла через исключение — нормальная ситуация.
Re[2]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 28.05.02 06:29
Оценка: 2 (2) +2
Здравствуйте VladD2, Вы писали:

[skip]

VD>goto это единственный сто процентный выход из ситуации. Но выход это плохой. Лучше переделать условие циклов так, чтобы они учитывали такую ситуацию. Например:


[skip]

Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...

ЗЫж Не флейма окаянного ради, может я и правда чего не знаю/понимаю?
Почетный кавалер ордена Совка.
Re: Выйти из двух циклов сразу
От: Mish Россия  
Дата: 27.05.02 10:26
Оценка: +3 -1
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


Использовать goto. Ничего страшного не будет при умеренном использовании goto.

Удачи.
Re[7]: Выйти из двух циклов сразу
От: Прах Украина  
Дата: 28.05.02 07:06
Оценка: -3 :)
Здравствуйте LeonGorbachev, Вы писали:


А>>Я обычно делаю так:

А>>
А>>bool bContinue = true;
А>>while(bContinue) {
А>>  for(int i = 0; i < 100; i++) {
А>>    if (i == 77) {
А>>      bContinue = false;
А>>      break;
А>>    }
А>>  }
А>>}
А>>


LG>Я в общем то так и делаю, только подумалось, что можно по-другому...


!!!! Класс ! (Это относительно последнего Вашего замечания) Я долго смеялся, спасибо.

Есть мнение чайника.
1. По моему это работа для ассемблера. А именно для команды КУЕ, тьфу, RET. Правда, я это не проверял на интелах но на 580-м она работает следующим образом:

застваляет процессор взять адрес из стэка и продолжить выполнение программного кода с этого адреса. Если у интела RET работает аналогично, то возможно можно запомнить адрес внешнего цикла, перед выходом запихноть его в стэк (возможно даже насильно )
и вызвать RET.
Но, т.к. это мнение чайника, то возможно лучше GOTO (т.к. доказано, что неполное знание — ОПАСНО).
Желаю всем вдохновения.
Ashes
Re[5]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 23:03
Оценка: 24 (3)
Здравствуйте WolfHound, Вы писали:

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


WH>И в обще для оценки качества кода есть 3 простых критерия:

WH>1)Наличие ошибок
WH>у вас покрайней мере одна
WH>2)Скорость работы
WH>эксепшены и вызовы процедур ее не увеличивают
WH>3)Затраты памяти
WH>у вас хоть не на много но больше

Есть и еще несколько но тебя они не волнуют. Ладно проверить твой код на скорость невозможно.

Предлагаю простой эксперемент напиши нам QuickSort в своем стиле. На твоей стороне будет ручной уход от рекусрсии и оптимизация путем хаотичного метания. А я тоже самое изображу в структурированном виде. Сравним что получивось (после компиляции этого дела VC7).

Вот мой вариант:
template <class SType> void __forceinline QuickSort(SType *item, int left, int right)
{
   SType x;
   int i = left;
   int j = right;   
   SType center = item[(left + right) / 2];
   while(i <= j)
   {
      while (item[i] < center && i < right)
         i++;
      while (item[j] > center && j > left)
         j--;
      
      if (i<=j)
      {
         x  = item[i];
         item[i] = item[j];
         item[j] = x;
         i++;
         j--;
      }
   } 
   if(left < j)
      QuickSort(item, left, j);
   if(right > i)
      QuickSort(item, i, right);
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 13:35
Оценка: 17 (2) -1
Здравствуйте m.a.g., Вы писали:

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


VD>>Повторюь еще раз. goto не структурированный оператор. И его ипользование вност хаотичность в код.


...>Про схемы Янова слышал? Посмотри — потом будешь говорить насчет неструктурированности. Все зависит от контекста.


Нет. Не слыхал. А они помогут мне при чтении кода утыконого безсмысленными goto?

VD>>У нас в конторе написано ~ 300 000 рабочего кода (не считая кода к статьям) на C++ и goto не разу не применялся. Один программист как то раз начал отстаивать точку зрения "что в его случае лучше применить goto" и рьяно так... но когда мы переписали его код, он и сам согласился, что так элегантнее, понятее и безопаснее.


...>Единственное условие применения структурных конструкций — "правило отсутствия неожиданностей".


Именно. У программисто вообще должно быть правило "не удивляй!".

...>Если применение goto удовлетворяет этому принципу — оно и элегантно, и понятно, и безопасно.


Несомненно. Но именно goto приводит неожиданным поворотам и заставляет постоянно переключать логику мышления на новый лад. Выход из вложенных циклов — это реже всего используемый вариант использования. Обработка ошибок, вернее очистка памяти? Ну, чтоже да если написать этот код акуратно, то он будет давольно понятен. Но тут встает вопрос. Что надежнее делать обработку ошибок можно и другими способами (исключения, классы-обертки). Как минимум классы-обертки дают занчительно более надежный код, потому как исключается ошибка програмиста (случайный return, исключение, забывчивость программиста, ...).

Испоьзование же goto для организации логики автоматически нарушает озученное тобой правило (надо иметь очнь не ординарное мышление, чтобы считать понятным переходы из if в else).

Получается, что разумным использованиме этого оператора остается только выход из глубоко вложенного цикла. Да и то в 90% случаев можно найти более элегантный способ.

А теперь о тенденциях. goto вреден тем что он сидит в мозгах у программиста. Это как наркотик. Даже если ты не хочешь его использовать но зарылся в ситуацию которая кажется безвыходной (на замыленный взгляд), человека так и подмывает использовать этот оператор. И о твоем принципе он незадумывается. Он просто говорит: а... проподи все проподом и лепит горбатого. Ну, а потом, чтобы оправдаться начинает рассуждать о том, что и на goto можно создавать структурированную логику. Конечно можно, но зачем эмулировать имеющиеся конструукции на goto?

Замечательным примером неоправданного использования goto является открытого 80% кода MS используещего этот самый оператор. Ихним программистам или просто в лом подумать. Или вообще на все плевать с большой вышки. В ATL есть три места где использован этот оператор. Одно из них является явным переносом унаследованного кода. Второе ленью (сделать один раз обертку для ресурса, вместо того чтобы писать гору goto и вручную освобождать ресурсы). Ну, а третье — это собственно не совем и ATL. Это шаблоны OLEDB. Там такое ламерство и нарушений всех принципов безопастного и культурного программирования, что волосы дыбом встают. Процедуры на 500 строк кода все испещьренные goto. Вот именно этого и не хочется встречать. И если человек стремится избежать применения goto (но разумно, не перегибая палку), то это не сомненно плюс. А рассуждения о том, что и на goto можно... приводят к тому, что когда нужно делать выбор между читабельностью и более простым решением проблемы, эти рассуждения будт подмывать программиста сделать неверный выбор. Именно так и пояыляется весь writeonly-код.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Выйти из двух циклов сразу
От: comer США http://getboost.codeplex.com/
Дата: 18.10.02 13:33
Оценка: 3 (2) +1
Здравствуйте potap, Вы писали:

MT>>>Можно так:

MT>>>
MT>>>while(1)
MT>>>{
MT>>>  for(int i = 0; i < 100; i++)
MT>>>  {
MT>>>    if(i == 77)
MT>>>      break;
MT>>>  }
MT>>>  if (i < 100) break;
MT>>>}
MT>>>


А>>Это прокатит только на VC6


P>Это почему же, интересно?! По-моему на любом C. Что здесь скользкого? Мне этот вариант нравится .


А мне этот вариант не нравиться, лучше все таки так:

while(1)
{
  for(int i = 0; i < 100; i++)
  {
    if(i == 77)
      goto LoopEnd;
  }
}
LoopEnd:


Так как в примере с оператором break Вы добавляете лишнее условие, и опасность там в том, что это условие зависит от условия в цикле — когда нибудь кто нибудь поменяет условие в цикле на другое, например поставит i<55. Вопрос: как долго Вы будете искать ошибку в программе?

По моему, не надо делать жестких принципов на оператор goto, используйте его там где это необходимо если язык не позволяет сделать Вам по другому без лишних затрат, таких как дополнительные условя, флаговые переменные и т.п.. Ну нет в C++ оператора выхода их нескользих циклов, значит используйте goto!!!

В данном случае goto, по моему субъективному мнению, наиболее логичный и ПОНЯТНЫЙ! goto это еще не самое страшное, страшнее когда логика запутанная!
getboost.codeplex.com
citylizard.codeplex.com
Re[4]: return
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.05.02 10:57
Оценка: 1 (1) +1 -1
Здравствуйте LeonGorbachev, Вы писали:

LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту.

LG>Чего делать?

Если есть возможность ВЫНЕСТИ эти циклы (не очень много переменных и т.д.),
можно сделать функцию и сделать возврат

...f(...)
{
  while(1)
  {
    for(int i = 0; i < 100; i++)
    {
      if(i == 77)
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
        return;
    }
  }
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Выйти из двух циклов сразу
От: OlegO Россия http://www.mediachase.ru
Дата: 27.05.02 10:31
Оценка: -1 :))
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


Например сгенерить исключение:

try
{
   while(1)
   {
     for(int i = 0; i < 100; i++)
     {
       if(i == 77)
          throw 77;
     }
   }
}
catch(int e)
{
   // e==77
}
С уважением, OlegO.
Re[2]: Выйти из двух циклов сразу
От: Mishka<T> Норвегия  
Дата: 27.05.02 10:38
Оценка: -3
Здравствуйте OlegO, Вы писали:

OO>
OO>try
OO>{
OO>   while(1)
OO>   {
OO>     for(int i = 0; i < 100; i++)
OO>     {
OO>       if(i == 77)
OO>          throw 77;
OO>     }
OO>   }
OO>}
OO>catch(int e)
OO>{
OO>   // e==77
OO>}
OO>


Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.
Re[5]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 06:56
Оценка: +1 -2
Здравствуйте, jazzer, Вы писали:


J>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.

Кривой дезайн. Что тут можно поделать? Ответ напрашивается сам собой...


J>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления

Совершенно верно, звучания недостаточно. Необходимо, как минимум, применение.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[11]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 31.05.02 05:46
Оценка: 24 (1) -1
Здравствуйте Patalog, Вы писали:

P>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...
Голь на выдумку хитра, однако...
Re[10]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 03.06.02 19:06
Оценка: 22 (2)
Здравствуйте WolfHound, Вы писали:

WH>Можно и так, но как писать это ЛИЧНОЕ дело программиста и пытаться изменить стиль того чьи программы РАБОТАЮТ это ВРЕДНАЯ трата времени.


Ошибаешься. Стиль может быть личным делом только одиночек и отщипенцев. В команде ты должен придерживаться стиля команды. И даже, если ты сам хорошо ориентируешся в безусловных переходах и пока ещё на наступал с ними на большие грабли, то это совсем не значит, что меняя твой код по каким либо причинам, кто-то другой не внесёт туда глюк по причине твоего столь "оригинального и ни на что не похожего" стиля.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 19.06.02 04:03
Оценка: 21 (2)
Здравствуйте Аноним, Вы писали:

P>>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


P>>ЗЫж Не флейма окаянного ради, может я и правда чего не знаю/понимаю?

А>Книжек почитайте, там все написано. Или в Минском БГУИР поучитесь, там объяснят

А еще лучше поучиться в Новосибирском НГУ. Тут объяснят, что всякое средство хорошо в своем контексте, и что есть парадигмы программирования, которые ничуть не хуже других, и при этом явно поощряют использование goto.

Эмоциональные возражения типа "а я такие программы читать не умею" не принимаются по следующим причинам:

1. Стили, поощряющие активное использование goto сейчас практически забыты (имхо незаслуженно) и найти программу, правильно использующую goto практически невозможно.
2. Такие возражения по сути своей являются завуалированной формой высказывания "Меня научили не ставить goto. Почему это так, я не знаю, но раз учили, значит это правильно". Причем из этого можно сделать вывод, что либо учителя плохо знают предмет и считают, что goto — это действительно плохо, что говорит либо об их некомпетентности, либо о поражении паразитом М0 и, как следствие, психологией паковщиков, либо учителя являются хорошими специалистами, но плохими педагогами, и забыли сказать, что goto плохо только в структурном программировании, что говорит о том, что ученики имеют психологию паковщиков, а не картостроителей и предпочли положить новый пакет знаний к себе в память, а не включить его в свою карту, забыв о том, что знания, выдаваемые учителями-картостроителями, являются не пакетом, а веером путей по карте.

ps: для дальнейших пояснений см Programmers' Stone.
Re[3]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 02.06.02 09:04
Оценка: 20 (2)
Здравствуйте WolfHound, Вы писали:

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


S>>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.


WH>
WH>int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
WH>{
WH>    HANDLE    mutex_lock=NULL;
WH>    MSG        msg;
WH>    char *s=NULL;
WH>    char st[1000];

WH>    msg.wParam=1;
WH>    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
WH>    if(GetLastError()==ERROR_ALREADY_EXISTS)
WH>        goto st_app_already_exists;
WH>    if(mutex_lock==NULL)goto st_fail;

WH>    app_hInstance = hInst;

WH>    WNDCLASS wnd_class;

WH>    wnd_class.style=            CS_PARENTDC;
WH>    wnd_class.lpfnWndProc=        WndProc;
WH>    wnd_class.cbClsExtra=        0;
WH>    wnd_class.cbWndExtra=        0;
WH>    wnd_class.hInstance=        app_hInstance;
WH>    wnd_class.hIcon=            NULL;
WH>    wnd_class.hCursor=            NULL;
WH>    wnd_class.hbrBackground=    NULL;
WH>    wnd_class.lpszMenuName=        NULL;
WH>    wnd_class.lpszClassName=    app_wnd_class_name;

WH>    if(!RegisterClass(&wnd_class))goto st_fail;

WH>    app_hWnd = CreateWindow(
WH>        app_wnd_class_name, app_window_name,WS_POPUP,
WH>        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
WH>        NULL,    NULL,    app_hInstance,    NULL
WH>    );

WH>    if(app_hWnd==NULL)goto st_fail;

WH>    ShowWindow(app_hWnd, SW_SHOW);
WH>    SetCursor(LoadCursor(NULL, IDC_ARROW));
WH>    ShowCursor(TRUE);

WH>    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
WH>    if(!app_timer)goto st_fail;

WH>    app_ready=1;
WH>st_message_loop:
WH>    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
WH>    if(app_active&&app_ready)goto st_work;
WH>    WaitMessage();
WH>    goto st_message_loop;
WH>st_check_message:
WH>    if(msg.message==WM_QUIT)goto st_quit;
WH>    TranslateMessage(&msg);
WH>    DispatchMessage(&msg);
WH>    goto st_message_loop;
WH>st_work:
WH>//=====================================================================
WH>//...
WH>//=====================================================================
WH>    goto st_message_loop;
WH>st_fail:
WH>    if(app_timer)            KillTimer(app_hWnd, app_timer);
WH>    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
WH>st_quit:
WH>st_app_already_exists:
WH>    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
WH>    return msg.wParam;
WH>}

WH>


Интересно, почему мне намного больше нравится следующий код?
И почему очень не нравится предыдущий код, особенно, если бы его писал мой подчиненный...
struct IdleHandler
{
  void OnIdle ()
  {
  //бывший st_work:;
  }
};
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
  try
  {
  CMutex mutex_lock (NULL, FALSE, "Some App MutexLock");
  if(GetLastError()==ERROR_ALREADY_EXISTS)
    return 1;
  CWindow main_wnd;
  if (main_wnd.CreateWindow(
        app_wnd_class_name, app_window_name,WS_POPUP,
        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN)
    )
    return 1;

  CMessageLoop theLoop;
  _Module.AddMessageLoop(&theLoop);
  IdleHandler idle_handler;
  theLoop.AddIdleHandler (&idle_handler);

  CTimer timer (main_wnd,APP_TIMER_ID,1000/60,NULL);
  theLoop.Run();
  }
  catch(...)
  {
    return 1;
  }
}


WH>Да если кто-то код не разобрал спршивайте не стесняйтесь.

WH>ЗЫ жаль оценки -10 нету.
WH>ЗЗЫ извините вырвалось.

ИМХО, с таким стилем кода сложно писать большие приложения.
Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 27.05.02 10:21
Оценка: 18 (1) :)
while(1)
{
  for(int i = 0; i < 100; i++)
  {
    if(i == 77)
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
  }
}


Как это сделать?
Re: А зайти?
От: folk Россия  
Дата: 21.04.03 22:27
Оценка: 18 (1) :)
Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов.
Как вы это обычно делаете?
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[15]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.06.02 22:49
Оценка: 17 (2)
Здравствуйте Alexander Shargin, Вы писали:


AS>>>Не очень понятно, к чему всё это. Можно конкретный пример?


IT>>Я к тому, что даже в приведённом тобой для C случая люди пытаются боряться с goto применением всевозможных сил и средств, например, макросов примерно так:


AS>Всё равно не понятно. Что с того, что кто-то так делает? Я, например, встречал такие конструкции редко. И там где встречал, матерился, так как приходилось разбираться, что стоит за этими макросами, и потом держать это в голове.


IT хотел сказать, что если оформить goto как-то так:

BEGIN_LOOP(A)(;;)
  BEGIN_LOOP(B)(int i = 0; i < 100; i++)
    if(i == 77)
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
      BREAK_LOOP(A);
  END_LOOP(B)
END_LOOP(A)

то читаться это будет намного лучше (даже человеком, который не знает реализацию данных макросов)


#define BEGIN_LOOP(a) for
#define END_LOOP(a) loop_##a:
#define BREAK_LOOP(a) goto loop_##a
Re[8]: Выйти из двух циклов сразу
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 27.05.02 12:07
Оценка: 15 (1) +1
Здравствуйте LeonGorbachev, Вы писали:

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


Kaa>>Здравствуйте Андрей, Вы писали:


А>>>Это прокатит только на VC6

Kaa>>Что именно? Scoping? Тогда да. А выход прокатит везде.
LG>Что такое Scoping?
Я имел ввиду, что область видимости переменной, объявленной в заголовке цикла, ограничена самим циклом (так написано в стандарте). В VC6 же это не так. Областью видимости переменных, там объявленых, является объемлющая для цикла область видимости.
Алексей Кирдин
Re[3]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.02 17:58
Оценка: 15 (1) :)
Здравствуйте Patalog, Вы писали:

P>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических?


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

P>Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


goto оператор неструктурного программирования. Стоит применить его один раз как захочется еще и еще... Читать такой код значительно сложнее. Научивщись же обходится без оного по прошествии некоторого времени начинаешь задаваться другим вопросом... Зачем нужен этот оператор?!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Выйти из двух циклов сразу
От: Андрей Россия  
Дата: 27.05.02 10:53
Оценка: 14 (2)
Здравствуйте Mishka<T>, Вы писали:

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


LG>>я вот как раз и не хочу через исключения. И не хочу гоу-ту.

LG>>Чего делать?

MT>Можно так:

MT>
MT>while(1)
MT>{
MT>  for(int i = 0; i < 100; i++)
MT>  {
MT>    if(i == 77)
MT>      break;
MT>  }
MT>  if (i < 100) break;
MT>}
MT>


Это прокатит только на VC6

Я обычно делаю так:

bool bContinue = true;
while(bContinue) {
  for(int i = 0; i < 100; i++) {
    if (i == 77) {
      bContinue = false;
      break;
    }
  }
}


Возможны варианты, в зависимости от контекста
Re[14]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 04.06.02 19:02
Оценка: 14 (2)
Здравствуйте IT, Вы писали:


AS>>Привет, Игорь. Я ждал твоего появления.


IT>А я ждал, что ты ждал моего появления


Ну, вот мы и дождались.


IT>>>Во-первых. Ты всё же зря не привёл ни одного примера goto здесь. В большинстве случаев, он не используется напрямую, для него пишутся макросы в которые он заворачивается вместе и if'ом и установкой кода ошибки. Да и сами метки делаются макросами и имеют всегда предопределённые имена.


AS>>Не очень понятно, к чему всё это. Можно конкретный пример?


IT>Я к тому, что даже в приведённом тобой для C случая люди пытаются боряться с goto применением всевозможных сил и средств, например, макросов примерно так:


Всё равно не понятно. Что с того, что кто-то так делает? Я, например, встречал такие конструкции редко. И там где встречал, матерился, так как приходилось разбираться, что стоит за этими макросами, и потом держать это в голове.


AS>>Не знаю на счёт "мы", а я спорю не об этом. Спагетти-код, который нам предложил WolfHound, я не одобряю. В своё время я наелся такими программами на ZX-Spectrum, и мне их вполне хватило. Спорю я в основном с Владом, а именно со следующими его утверждениями.


AS>>1. goto не следует использовать никогда и ни при каких обстоятельствах (в том числе в случае с вложенными циклами, с которых мы начали). Моё мнение: иногда можно.


IT>Никто не будет устанавливать лимит в применении одного goto на 1000 строчек кода или на одну программерскую жизнь. Иногда можно — значит можно вообще. Влад, мне думается, уже наелся этих можно по самое нихачу, при этом не столько своих, а тех за кем потом приходилось подчищать. По-этому, я его прекрасно понимаю. Запрет на использование goto в конторе — нормальная вещь, без него всегда можно обойтись, а с ним иногда могут быть проблемы.


Нет, Игорь, давай сразу отделим мухи от котлет. Или мы разговариваем о программировании как таковом, или об организации работы в отдельно взятой команде. На втором пути можно зайти очень далеко. Можно запретить перегрузку операторов, так как они запросто могут привести к соверщенно нечитаемым программам. Можно позапрещать нафиг шаблоны, так как они плохо переносятся и могут приводить к совершенно нечитабельному коду (и некоторые так и делают — просто запрещают их). И, кстати, большинство программистов не умеет нормально использовать исключения. Я знаю совсем немного программистов, которые в моём примере выще лёгким и непринуждённым движением руки напишут свои/используют существующие обёртки для указателей и хэндлов, а без таких обёрток исключения не доведут до добра. Короче, в команде возможны любые решения. И им нужно следовать. В своём письме я об этом написал. Если это всё, чего ты хотел от меня добиться, то тему можно закрывать.

Если же мы таки говорим о программировании, то давай говорить о нём.


IT>Тем более он говорил о C++, а ты в своих примерах упираешь на C и обосновываешь необходимость применение goto в нём. Ради бога, но не надо переносить затем результаты рассуждений на C++. В C++ goto не нужет совсем, а вот на asm'е без jmp никак, и зачем это сравнивать.


Я не упираю на C. Я вообще заговорил о нём потому, что мне было интересно: может быть, кто-то сможет убедительлно продемонстрировать ущербность goto, использую только принципы структурного программирования. Но кроме твоих if-ов, похоже, придумать нечего. Об этом я ещё напишу ниже.

А пока — согласен — давай сосредоточимся на C++. Для начала обратимся к теме, которая стоит в сабже. В первом письме я подробно остановился именно на ней. Итак, каким образом поставленная задача решается на C++ лучше, чем с использованием goto?


AS>>2. goto автоматически порождает нечитабельные и плохо поддерживаемые/расширяемые программы. Моё мнение: не обязательно, хотя часто.


IT>Ну вот опять. Плохо уже то, что он вообще эти проблемы пораждает.


Проблемы может порождать всё, что угодно. То же ООП — пачками. Я насмотрелся на пограммы, которые люди пишут в рамках концепции doc/view, которую предлагает MFC. Ей богу, уж лучше бы они свалили весь код в один класс. Именно поэтому в нашей профессии кадры решают почти всё. Эта глобальная проблема, которую не обойти запретами каких-то языковых средств. Просто если человек ламер, он повиснет на проекте тяжёлой гирей, а если нет — будет тянуть его вверх. И твои запреты вряд ли смогут сильно изменить ситуацию.


AS>>3. Если человек использует goto, то он — ламер (и далее рассуждения о том, что это как норкотик и т. д.) Моё мнение — не факт (кстати, см. результаты голосования на текущий момент). Просто нужно пользоваться с умом. Впрочем, это касается и любых других средств языка C++.


IT>Умом желательно пользоваться всегда. К сожалению, это одна из специфик нашей профессии. Конечно, челевек использующий goto не всегда ламер, но если он вообще его не использует, то он и не вызывает подозрения в том что он может быть ламером.


Ну, это уже словесная эквилибристика. Sergey уже писал, и я с ним согласен, что если человек использует исключения для выхода из цикла, это гораздо больше рассказывает о его квалификации.


AS>>Вполне возможно. Когда без goto лучше, чем с ним, избавляйся на здоровье. Цель программиста — написать хорошую программу. Какие средства для этого используются — безразлично. Критерии "хорошести" тоже могут быть разными (см. моё предыдущее письмо), но это уже отдельный разговор.


IT>Безразлично только в одном случае, если твой код кроме тебя больше никому не нужен. Тогда точно безразлично.


Ничего подобного. Структурное программирование, ООП и пр. — не самоцель. Они должны служить делу эффективности, понятности, расширяемости и др. действительно важным целям, которые ты прекрасно знаешь и без меня. Так вот если в каком-то случае они скорее помеха, чем подмога, то лучше не забывать о главных целях, а не цепляться за принципы. Это примерно то, к чему я призываю.


IT>>>В-четвёртых. Можно тот же код с очисткой ресурсов написать и без всего этого. Я писал на C года четыре и прекрасно обходился без подобной техники. Можем проверить, давай код с goto, я его перепишу на if'ы.


AS>>Я и сам могу. Вопрос, будет ли твой вариант более читабельным. Думаю, что совсем не обязательно.


IT>Естественно, цепочки if'ов тоже не лучший пример читабельности, но они вполне нормально заменяют технику, показанную тобой.


Я скажу больше: они хуже, так как затрудняют и понимание, и расширяемость. Ты сам заметил, что метод с goto сильно напоминает эмуляцию деструкторов, которые и являются наилучшим решением данной задачи. Если в функцию добавляется ещё один ресурс, при моём подходе достаточно:
— добавить его в секцию переменных
— добавить код очистки в конец
— работать с ресурсом как ни в чём не бывало.

Логика же вложенных if-ов при таком добавлении может полностью измениться. Вот это-то как раз и плохо.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[5]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.02 18:02
Оценка: 10 (1) -1
Здравствуйте Vladik, Вы писали:

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


DG>>Компиляторы иногда путаются с goto, и могут не правильно вызывать конструкторы\деструкторы.


V>Предлагаешь ориентироваться на глючные компиляторы? На самом деле "выход из вложенного цикла" (не путать с "прыжком во вложенный цикл — классический пример, когда можно и даже нужно использовать goto. И прежде всего как раз из соображений наглядности, которую так портит goto в более других случаях.


На самом деле, наличие goto (даже в таких случаях) говорит о слабости проектирования (алгоритма) и не умелом использовании структурных возможностей языка. Всегда можно престроить код так, чтобы небыло операторов goto, циклов while(1) или for(;)... и при этом сделать код даже читабельней и проще. Так что в этой ситуации я бы для начала задался вопросом: а зачем нужен while(1)?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 19:14
Оценка: 10 (2)
Здравствуйте WolfHound, Вы писали:

WH>Можно и так, но как писать это ЛИЧНОЕ дело программиста и пытаться изменить стиль того чьи программы РАБОТАЮТ это ВРЕДНАЯ трата времени.


Если программист не владелец своей конторы (или совладелец...), то единственное его личное дело — это выбрать контору в которой он будет работать.

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

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

Так, что программист не внимающий призывам авторитетных людей (типа Страуструпа или Буча), вынужден быть одиночкой или работать на ламеров (при этом оставляя свое развитие на уровне работодателя). Не спорю можно найти богатого идиота работодателя и жить 4fun, но самые прекрасные минуты жизни будут проходить в барах и на б#%^&*ах. Вот только стоит ли?

PS

Возвращаясь к исходному вопросу, могу сказать, что все пример приводимые в защиту goto надуманные. Они появились из-за неумения использовать структурных- и ОО-принципов программирования. Я практически на 100% уверен, что первые двадцать участников топа этого сайта не одобрили бы использование goto, но можно и собрать статистику про простому люду. Для этого я создал новое голосование Можно ли использовать goto?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.02 12:57
Оценка: 6 (1) -1
Здравствуйте LeonGorbachev, Вы писали:

LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


goto это единственный сто процентный выход из ситуации. Но выход это плохой. Лучше переделать условие циклов так, чтобы они учитывали такую ситуацию. Например:
bool b = true;
while(1)
{
  for(int i = 0; b && i < 100; i++)
  {
    if(i == 77)
    {
      // вот тут хочу выйти вообще из всех циклов - из  for и из 
      b = false;
      break;
    }
    // Если далее есть кол...
    // то дописываем проверку:
    if(b)
      break;
    // некоторый код
  }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Выйти из двух циклов сразу
От: Stoune  
Дата: 30.03.03 18:24
Оценка: 1 (1) +1
Здравствуйте, VladD2, Вы писали:


VD>На самом деле, наличие goto (даже в таких случаях) говорит о слабости проектирования (алгоритма) и не умелом использовании структурных возможностей языка. Всегда можно престроить код так, чтобы небыло операторов goto, циклов while(1) или for(;)... и при этом сделать код даже читабельней и проще. Так что в этой ситуации я бы для начала задался вопросом: а зачем нужен while(1)?


При всём моём уважении господин Владислав, по моему вы не правы, а как по вашему почему goto до сих пор оставили в Сях, судя за вашей логикой он вообще в языке не нужен, зачем строить штучные и противоестественные конструкции, если есть простое и эфективное решение.
Если вас не убедил, то процитирую также Евангелие от Страуструпа, стр.179, раздел 6.3.4:
....
   Одним из немногих разумных способов использования goto в обычном коде является выход из вложеного цыкла или switch-интрукции
....
Язык програмирования С++,спец.изд./Пер.с англ. - М.;СПб.:"Издательство БИНОМ"-"Невский Диалект",2001 г.-1099 с., ил

Причина такой нелюбви к этой конструкции у вас очевидно как и у меня это просто рефлекс который нам привили с первых курсов преподаватели ВУЗов, у меня например на 2-ом курсе заставляли обходится без неё, даже если ёё применнение было целесобразным, а увидев в коде более 3-х балов расчитывать не приходилось, вот так инстинкт собаки Павлова в наглядном виде так сказать .
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 01.06.02 07:40
Оценка: -2
Здравствуйте Syber, Вы писали:

S>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    HANDLE    mutex_lock=NULL;
    MSG        msg;
    char *s=NULL;
    char st[1000];

    msg.wParam=1;
    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
    if(GetLastError()==ERROR_ALREADY_EXISTS)
        goto st_app_already_exists;
    if(mutex_lock==NULL)goto st_fail;

    app_hInstance = hInst;

    WNDCLASS wnd_class;

    wnd_class.style=            CS_PARENTDC;
    wnd_class.lpfnWndProc=        WndProc;
    wnd_class.cbClsExtra=        0;
    wnd_class.cbWndExtra=        0;
    wnd_class.hInstance=        app_hInstance;
    wnd_class.hIcon=            NULL;
    wnd_class.hCursor=            NULL;
    wnd_class.hbrBackground=    NULL;
    wnd_class.lpszMenuName=        NULL;
    wnd_class.lpszClassName=    app_wnd_class_name;

    if(!RegisterClass(&wnd_class))goto st_fail;

    app_hWnd = CreateWindow(
        app_wnd_class_name, app_window_name,WS_POPUP,
        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
        NULL,    NULL,    app_hInstance,    NULL
    );

    if(app_hWnd==NULL)goto st_fail;

    ShowWindow(app_hWnd, SW_SHOW);
    SetCursor(LoadCursor(NULL, IDC_ARROW));
    ShowCursor(TRUE);

    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
    if(!app_timer)goto st_fail;

    app_ready=1;
st_message_loop:
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
    if(app_active&&app_ready)goto st_work;
    WaitMessage();
    goto st_message_loop;
st_check_message:
    if(msg.message==WM_QUIT)goto st_quit;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    goto st_message_loop;
st_work:
//=====================================================================
//...
//=====================================================================
    goto st_message_loop;
st_fail:
    if(app_timer)            KillTimer(app_hWnd, app_timer);
    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
st_quit:
st_app_already_exists:
    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
    return msg.wParam;
}


Да если кто-то код не разобрал спршивайте не стесняйтесь.
ЗЫ жаль оценки -10 нету.
ЗЗЫ извините вырвалось.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Выйти из двух циклов сразу
От: Аноним  
Дата: 25.07.02 14:08
Оценка: -2
Здравствуйте Андрей, Вы писали:

слегка подправить можно
  bool bContinue = true;
  for(int i = 0; (i < 100) && bContinue; i++)
  {
    if (i == 77)
    {
      bContinue = false;
      break;
    }
  }
Re[8]: Выйти из двух циклов сразу
От: Areex  
Дата: 24.04.03 08:44
Оценка: +1 -1
Здравствуйте, Plague, Вы писали:

P>IMHO? проблема не в том ка goto работает, а насколько читабельны программы с goto.


Вот все зарекаюсь больше эту ветку не читать и все равно читаю.
Вы поймите, не разницы между goto out; и break. И так и так последовательное исполнение программы нарушается. Ну какая тебе разница, что искать выход из цикла или метку? Метку даже проще.

P>Но при всем при этом я не сторонник goto! считайте это религией... мои доводы:


Во-во, один ляпнул "goto от диавола", и все бросились повторять. Я пять раз гоуту не использовал, а я шесть, благослови батюшка Николас.

P>Если весь текст цикла умещается на экране, зачем использовать goto, а если — нет, то я сомневаюсь что при использовании получится явное преимущество. Как тот, кто будет читать вашу программу поймет, не видя цикл целиком, куда ведет goto? По имени метки? Вед главный довод goto в


Так же как и не видя окончания цикла. Нажмет PgDn и посмотрит. Знаешь так далеко зайти можно, мало ли что ты в программе не видишь. Ты вот скорее всего не видишь опеределения класса. И что? Да ничего, откроешь и посмотришь. Не надо придумывать проблему там, где ее нет.

P>Для большого числа вложенных циклов я вообще рекоммендую пересмотреть алгоритм.


Согласен, об этом и речи нет. Вопрос в том, что делать если это не возможно.

P>Применение goto очень часто приводит к более широкому его


Ну что все залади повторять, приводит -- не приводит. Чем это он приводит? Я так же могу утверждать, что специальное избегание гоуту приводит к нечитаемому коду. Поскольку человек следуя догмам, лепит не задумываясь пургу всякую.

P>В конечном итоге: есть комментарии которые неплохо было бы расставлять в таких местах, чтоб не забыть, что здесь происходит.


А еще метку внятно назвать. Видишь как все просто. Если ты видишь метку goto end_of_this_cycle это снизит тебе читабельность?

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


Применять надо не на крайний случай, не где попало, а только там где уместно. Как собственно и любую вещь.
"Oh. He'll miss. Just look at my AC."
Re[17]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.06.02 09:30
Оценка: 18 (1)
Здравствуйте Alexander Shargin, Вы писали:

AS>Думаю, для начала выжимки будет достаточно. Считай, что у тебя есть вычислительный алгоритм, в котором попался двойной цикл типа


AS>
AS>for(int i=0; i<1000; i++)
AS>   for(int j=0; j<1000; j++)
AS>      if(i == 666 && j == 123)
AS>      {
AS>         // выходим
AS>      }
AS>


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

for (Pos i(0, 0); i < Pos(1000, 1000); ++i)
{
  if (i.x == 666 && i.y == 123)
    break;
}



IT>>1. Флаг в первом цикле

IT>>2. Проверка счётчика второго цикла на завершённость
IT>>3. return
IT>>4. inline процедура (очень специфический вариант, но возможный)

Я бы еще добавил:
5. использовать goto, но спрятать за макросами (одиннаковыми для всей команды)
6. вышеприведенный двухмерный "итератор"
Re[14]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.06.02 16:47
Оценка: 18 (1)
Здравствуйте Sergey, Вы писали:

S> Я уж не говорю про использование исключений для выхода из цикла :)


Сейчас специально взял и написал небольшой тестик, вот что он выдал:

1. 410мс - вложенные циклы, выход происходит по goto, try/catch снаружи нет
2. 410мс - вложенные циклы, выход происходит по goto, снаружи циклы обернуты в try-catch
3. 620мс - вложенные циклы, выход происходит по goto, снаружи циклы обернуты в try-catch, 
   внутри цикла есть конструкция throw 1, которая никогда не вызывается
4. 410мс - вложенные циклы, выход происходит по goto, try/catch снаружи нет, 
   внутри цикла есть конструкция throw 1, которая никогда не вызывается
5. 620мс - вложенные циклы, выход происходит по goto, снаружи циклы обернуты в try-catch,
   внутри цикла есть внешняя функция (которая для чистоты эксперимента опять никогда не вызывается)
6. 623мс - вложенные циклы, выход происходит по throw

Разброс результатов +/- 3мс.

Резюме:
1. как только у вас в программе появляется конструкция try/catch, то всё, что внутри try будет работать в полтора раза медленнее (за исключением простых случаев, когда весь подставляемых код в try не содержит внешних вызовов & выбросов исключений).
2. использование throw для выхода из цикла, замедляет работу программы всего на 1 процент по сравнению с добавлением try/catch.
3. Если обработка ошибок построена на исключениях, то из цикла можно также выходить по исключению без уменьшения производительности.


Тестировалось все на VC7 Release, на VC6 Release были примерно похожие результаты.

Методика тестирования:
Брался цикл:
    int sum = 0;
    for (int k = 0; k < ZERO_COUNT; ++k)
    {
      for (int i = 0; i < FIRST_COUNT; ++i)
      {
        for (int j = 0; j < SECOND_COUNT; ++j)
        {
          //по этой ветке выходим
          if (i == BREAK_COND_I && j == BREAK_COND_J)
            goto end_loop;
          //эта ветка никогда не выполняется(имитируем присутсвие обработок ошибок)
          if (i == DUMMY_COND_I && j == DUMMY_COND_J)
            goto end_loop;
          sum += j;
        }
      }
      end_loop:;
    }

1. Цикл прогонялся без модификаций
2. Цикл по i, заворачивался в try/catch
3. Цикл по i, заворачивался в try/catch, "goto end_loop" в dummy-ветке заменялся на throw 1;
4. Цикл по i, не заворачивался в try/catch, "goto end_loop" в dummy-ветке заменялся на throw 1;
5. Цикл по i, заворачивался в try/catch, "goto end_loop" в dummy-ветке заменялся на вызов non-inline функции;
6. Цикл по i, заворачивался в try/catch, оба "goto end_loop" заменялись на throw 1


Значения констант были такие:
#define ZERO_COUNT 1000
#define FIRST_COUNT 1000
#define SECOND_COUNT 100
#define BREAK_COND_I (9*FIRST_COUNT/10)
#define BREAK_COND_J (6*FIRST_COUNT/10)
#define DUMMY_COND_I (FIRST_COUNT*2)
#define DUMMY_COND_J (BREAK_COND_J)
Re[13]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 04.06.02 16:37
Оценка: 16 (1)
Здравствуйте Alexander Shargin, Вы писали:

AS>Привет, Игорь. Я ждал твоего появления. ;)


А я ждал, что ты ждал моего появления :))

IT>>Во-первых. Ты всё же зря не привёл ни одного примера goto здесь. В большинстве случаев, он не используется напрямую, для него пишутся макросы в которые он заворачивается вместе и if'ом и установкой кода ошибки. Да и сами метки делаются макросами и имеют всегда предопределённые имена.


AS>Не очень понятно, к чему всё это. Можно конкретный пример?


Я к тому, что даже в приведённом тобой для C случая люди пытаются боряться с goto применением всевозможных сил и средств, например, макросов примерно так:

#define START  int _err_code = 0;
#define ERROR  error:
#define EXIT   return _err_code;
#define CHECK(er,test) if (!(test)) { _err_code = er; goto _error; }

int foo(void *p)
{
    START;

    CHECK(1,p);
    // and so on

    ERROR:
    // some cleanup code
    EXIT;
}


AS>Не знаю на счёт "мы", а я спорю не об этом. Спагетти-код, который нам предложил WolfHound, я не одобряю. В своё время я наелся такими программами на ZX-Spectrum, и мне их вполне хватило. Спорю я в основном с Владом, а именно со следующими его утверждениями.


AS>1. goto не следует использовать никогда и ни при каких обстоятельствах (в том числе в случае с вложенными циклами, с которых мы начали). Моё мнение: иногда можно.


Никто не будет устанавливать лимит в применении одного goto на 1000 строчек кода или на одну программерскую жизнь. Иногда можно — значит можно вообще. Влад, мне думается, уже наелся этих можно по самое нихачу, при этом не столько своих, а тех за кем потом приходилось подчищать. По-этому, я его прекрасно понимаю. Запрет на использование goto в конторе — нормальная вещь, без него всегда можно обойтись, а с ним иногда могут быть проблемы. Тем более он говорил о C++, а ты в своих примерах упираешь на C и обосновываешь необходимость применение goto в нём. Ради бога, но не надо переносить затем результаты рассуждений на C++. В C++ goto не нужет совсем, а вот на asm'е без jmp никак, и зачем это сравнивать.

AS>2. goto автоматически порождает нечитабельные и плохо поддерживаемые/расширяемые программы. Моё мнение: не обязательно, хотя часто.


Ну вот опять. Плохо уже то, что он вообще эти проблемы пораждает.

AS>3. Если человек использует goto, то он — ламер (и далее рассуждения о том, что это как норкотик и т. д.) Моё мнение — не факт (кстати, см. результаты голосования на текущий момент). Просто нужно пользоваться с умом. Впрочем, это касается и любых других средств языка C++.


Умом желательно пользоваться всегда. К сожалению, это одна из специфик нашей профессии. Конечно, челевек использующий goto не всегда ламер, но если он вообще его не использует, то он и не вызывает подозрения в том что он может быть ламером. :)

AS>Вполне возможно. Когда без goto лучше, чем с ним, избавляйся на здоровье. Цель программиста — написать хорошую программу. Какие средства для этого используются — безразлично. Критерии "хорошести" тоже могут быть разными (см. моё предыдущее письмо), но это уже отдельный разговор.


Безразлично только в одном случае, если твой код кроме тебя больше никому не нужен. Тогда точно безразлично.

IT>>В-четвёртых. Можно тот же код с очисткой ресурсов написать и без всего этого. Я писал на C года четыре и прекрасно обходился без подобной техники. Можем проверить, давай код с goto, я его перепишу на if'ы. ;o)


AS>Я и сам могу. Вопрос, будет ли твой вариант более читабельным. Думаю, что совсем не обязательно.


Естественно, цепочки if'ов тоже не лучший пример читабельности, но они вполне нормально заменяют технику, показанную тобой.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 22:34
Оценка: 15 (1)
Здравствуйте DarkGray, Вы писали:

DG>ИМХО, с таким стилем кода сложно писать большие приложения.


Писать можно... читать нельзя.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: goto - это оператор языка
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.06.02 14:06
Оценка: 15 (1)
Насколько я в курсе (давно это было, отошёл от теории), есть положение, согласно которому любую программу можно написать без goto.

Я приведу аналогию этому положению из Тории Логики: точно так же как любое сложности логическое выражение можно записать с помощью двух операций — И и НЕ (или ИЛИ и НЕ), не применяя любых других. Невзирая на то, что получившаяся сложность выражения может увеличиться или может уменьшиться. Это, наверное, известный факт.

Так же и с goto. Переходы могут быть заменены на if (переход вниз) или cycle (переход вверх). Я не знаю точно для чего такая замена была обоснована, но то что она вызвала фурор на ровном месте — очевидно. Но, в точности с предыдущей аналогией, сложность программы может увеличиться или уменьшиться.

Однако, мало кто, защищая goto, защищает логические манипуляции — каждый пишет логические выражения согласно пониманию и по возможности короче, а не отстаивая принцип 2 операций.

Лично для меня проблема goto такова: goto — это оператор языка. Не больше и не меньше.

Для программ-однодневок или программ, тестирующих какие-то возможности системы, я даже не задумываюсь при использовании его.

Но для программ-модулей в долгосрочном использовании у меня отношение иное, наверное, действительно как отголосок из Фортрановского прошлого. Если мне нужно вставить этот оператор в действующий код, исходя из обстоятельств (например, нужно сделать сегодня), я вставляю его, НО это звоночек в сторону того, что этот кусок программы пришёл в несоответствие с требованиями (перерос их), которые накладывались на него изначально при проектировании его, и, следовательно, должен быть пересмотрен в самое ближайшее время. И не в коем случае нем может быть рассмотрен как идеальный вариант, как "так и должно быть". Невзирая на то, как смотрится этот код — идеально или нет. Потому что в нем что-то "не так", следующие изменения могут быть не такими простыми и т.д. и т.п. Однако при перепроектировании этого места goto могут быть и оставлены (или добавлены). Вот такое сложное отношение к нему.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[35]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 05.06.02 19:40
Оценка: 15 (1)
Здравствуйте VladD2, Вы писали:

VD>Это не ерись. Это общепринятое определение.


http://denisbooks.rema.ru:8101/peaple.out.html

VD>>>Что в них верить, то? Поставь себе Кваку или Старкрафт и убедись. Они универсальны для своей области.


GS>>"Они летают, но низэнько-низэнько..."


VD>Они работают. Сам видел.


"Они универсальны, но в своей области".
GS
Re[4]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 15:04
Оценка: 15 (1)
Здравствуйте Хитрик Денис, Вы писали:

TL>>Ну надо же как-то развлекаться? Мы вот как-то развлекались над фразой "кошка Мебиуса — это кошка, которая гуляет сама по себе". Где-то час после обеда пытались представить, как могла бы выглядеть "Кошка Мебиуса"...


ХД>

ХД>Прикольно, но не по теме!

В сад меня! Я все равно не в состоянии читать тему на 240 сообщений, да еще и со здоровенными кусками кода по ходу обсуждения уже и невесть чего...
Голь на выдумку хитра, однако...
Re[14]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 08.06.02 02:05
Оценка: 15 (1)
Здравствуйте Sergey, Вы писали:

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


S>А, таки кто-то вспомнил о мамонте, ради поражения которого и придумывался кремневый наконечник для копья, более известный как goto. Ну так такие задачи, если они большие, уж много лет принято естественным или не очень образом раскладывать на более мелкие, и с данными работать локально.


Да, но если вдруг внутри крупной проблемы возникает мелкая задачка, которая естественным образом раскладывается в глобальные операции над глобальными данными (fe какая-нибудь задача трансформации строки, управляемая правилами), то лучше этот маленький кусочек написать в стиле схем Янова и не мучать себя структурностью.

Вообще, написание действительно большого проекта в одном стиле свидетельствует либо о недостаточной квалификации разработчиков, либо о дефекте проектирования. Всегда возникают локальные подзадачи, лучше выражаемые на стиле, отличном от основного. Если при этом язык позволяет поддержать все используемые стили, то это вообще шикарно. Не буду голословным:

— кто сейчас пишет парсеры вручную? есть же lex/yacc/bison/antlr etc Ведь парсеры — обработка, основанная на
правилах, структурно писать их не слишком удобно

— 'AI' в игрушках, что бы не говорили, писать на Prolog/Refal удобнее, чем на C/C++

— конечные автоматы тоже не слишком удобно реализуются на C/C++. Гораздо удобнее моделировать их на UML и
создавать код автоматически (кстати, проект Zebra, в котором я работаю, этим и занимается)

— Событийная модель. В ООП ложится, но вот в структурность — никак.

— Математика. Ну как ее в ООП засунуть? Самая мощная модель, которая помогает работать с математикой —
объектная, благо отношения наследования в ООП в математике никак не помогают (заинтересовавшихся отсылаю
к книге Элджера "C++ for real programmers" или в любую книгу по теории моделей). Так что писать ООП
программы для работы с математическими выражениями не слишком удобно, тут нужно либо обобщенное, либо
структурное программирование, непосредственно выражающие алгоритмику.

— [место для вашей рекламы]

Таким образом, каждую часть кода нужно писать в том стиле, который наиболее естественен для решаемой подзадачи (вот меня недавно хотели усадить трансформировать UML диаграмму -> HTML с помощью Java. Не дался, на XSLT все сделал), а вот для каждого конкретного стиля можно решать, нужен там goto или его туда вообще вставлять нельзя.

S>>>А вообще, у оператора goto есть одна неприятная особенность — он потенциально может передать управление куда угодно, "вверх" или "вниз", в отличие от return или break. Струкутурно программа написана или как-то иначе, роли не играет — тупо увеличивается время на поиск метки. Чеолвек мыслит в основном идиомами, а неоправданное применение goto эти идиомы разбивает (оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup).


Поправка. Обыкновенная зашоренность сознания. Идиомы, говорящие, что не будет неожиданного перехода — структурные идиомы. Человеку, привыкшему писать в структурном стиле, сложно понять реализацию схем Янова, очевидно. Человеку, привыкшему реализовывать схемы Янова, трудно понять структурные программы. Бывалому ассемблерщику метку найти очень просто , но он будет долго разбираться со специализацией шаблонов etc
Re[9]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.02 23:17
Оценка: 10 (1)
Здравствуйте DarkGray, Вы писали:

DG>А если это был не двухмерный массив, а коллекция, элементы которой тоже содержать коллекции?

DG>

DG>foreach(Item item in Items)
DG>{
DG>  foreach (ChildItem childItem in item.ChildItems)
DG>  {
DG>    if (childItem.IsBad)
DG>      break;

DG>  }
DG>}
DG>


Ну тогда в школу... изучать структурное программирование.

ChildItem GetBadChild(ChildItemsCollection cic)
{
  foreach (ChildItem childItem in cic)
    if(childItem.IsBad)
      return childItem;
  return null;
}

...

foreach(Item item in Items)
{
  ChildItem ci = GetBadChild(item.ChildItems);
  ...
}
... << RSDN@Home 1.0 alpha VladD2.1.0.alpha 12.1.0.1019.39707 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Выйти из двух циклов сразу
От: Chorkov Россия  
Дата: 01.06.02 08:57
Оценка: 8 (1)
Здравствуйте WolfHound, Вы писали:

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


S>>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.


WH>
WH>int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
WH>{
WH>    HANDLE    mutex_lock=NULL;
WH>    MSG        msg;
WH>    char *s=NULL;
WH>    char st[1000];

WH>    msg.wParam=1;
WH>    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
WH>    if(GetLastError()==ERROR_ALREADY_EXISTS)
WH>        goto st_app_already_exists;
WH>    if(mutex_lock==NULL)goto st_fail;

WH>    app_hInstance = hInst;

WH>    WNDCLASS wnd_class;

WH>    wnd_class.style=            CS_PARENTDC;
WH>    wnd_class.lpfnWndProc=        WndProc;
WH>    wnd_class.cbClsExtra=        0;
WH>    wnd_class.cbWndExtra=        0;
WH>    wnd_class.hInstance=        app_hInstance;
WH>    wnd_class.hIcon=            NULL;
WH>    wnd_class.hCursor=            NULL;
WH>    wnd_class.hbrBackground=    NULL;
WH>    wnd_class.lpszMenuName=        NULL;
WH>    wnd_class.lpszClassName=    app_wnd_class_name;

WH>    if(!RegisterClass(&wnd_class))goto st_fail;

WH>    app_hWnd = CreateWindow(
WH>        app_wnd_class_name, app_window_name,WS_POPUP,
WH>        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
WH>        NULL,    NULL,    app_hInstance,    NULL
WH>    );

WH>    if(app_hWnd==NULL)goto st_fail;

WH>    ShowWindow(app_hWnd, SW_SHOW);
WH>    SetCursor(LoadCursor(NULL, IDC_ARROW));
WH>    ShowCursor(TRUE);

WH>    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
WH>    if(!app_timer)goto st_fail;

WH>    app_ready=1;
WH>st_message_loop:
WH>    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
WH>    if(app_active&&app_ready)goto st_work;
WH>    WaitMessage();
WH>    goto st_message_loop;
WH>st_check_message:
WH>    if(msg.message==WM_QUIT)goto st_quit;
WH>    TranslateMessage(&msg);
WH>    DispatchMessage(&msg);
WH>    goto st_message_loop;
WH>st_work:
WH>//=====================================================================
WH>//...
WH>//=====================================================================
WH>    goto st_message_loop;
WH>st_fail:
WH>    if(app_timer)            KillTimer(app_hWnd, app_timer);
WH>    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
WH>st_quit:
WH>st_app_already_exists:
WH>    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
WH>    return msg.wParam;
WH>}

WH>



ЭТО может выглядеть так:

class CAutoMutex
{
public:
    HANDLE H;
    inline CAutoMutex(void) 
        : H(NULL)
    {;};
    inline CAutoMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName)
        : H(CreateMutex(lpMutexAttributes,bInitialOwner,lpName))
    {;};

    inline ~CAutoMutex(void) 
    { 
        if(H!=NULL) 
            CloseHandle(H); 
    };

    inline operator HANDLE(void) const 
        {return H;};
    inline HANDLE operator =(const HANDLE& H2)
        {return H=H2;};
};

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    MSG        msg;
    char *s=NULL;
    char st[1000];
    WNDCLASS wnd_class;
    msg.wParam=1;

    CAutoMutex mutex_lock(NULL, FALSE, "SomeApp mutex_lock");

    if(GetLastError()==ERROR_ALREADY_EXISTS)
        return msg.wParam;

    try
    {
        if((HANDLE)mutex_lock==NULL) throw NULL; 

        app_hInstance = hInst;


        wnd_class.style=            CS_PARENTDC;
        wnd_class.lpfnWndProc=        WndProc;
        wnd_class.cbClsExtra=        0;
        wnd_class.cbWndExtra=        0;
        wnd_class.hInstance=        app_hInstance;
        wnd_class.hIcon=            NULL;
        wnd_class.hCursor=            NULL;
        wnd_class.hbrBackground=    NULL;
        wnd_class.lpszMenuName=        NULL;
        wnd_class.lpszClassName=    app_wnd_class_name;


        if(!RegisterClass(&wnd_class)) throw NULL;

        app_hWnd = CreateWindow(
            app_wnd_class_name, app_window_name,WS_POPUP,
            0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
            NULL,    NULL,    app_hInstance,    NULL
        );

        if(app_hWnd==NULL) throw NULL;

        ShowWindow(app_hWnd, SW_SHOW);
        SetCursor(LoadCursor(NULL, IDC_ARROW));
        ShowCursor(TRUE);

        app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
        if(!app_timer) throw NULL; 

        app_ready=1;

        for(;;)
            if(!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                if(msg.message==WM_QUIT) 
                    return msg.wParam;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
                if(!(app_active&&app_ready))
                    WaitMessage();

    }
    catch(...)
    {
        if(app_timer)            KillTimer(app_hWnd, app_timer);
        if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
    };
    return msg.wParam;
}

P.S. Самозакрывающиеся хаднлеры лучьше использовать стандартные (из WTL или MFC), но я привык к своим, поэтомы так и написал.
Тоже верно и для исключений
Re[7]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 31.05.02 20:01
Оценка: 6 (1)
Здравствуйте VladD2, Вы писали:

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


VD>Приношу свои извинения. Забыл поставить [code].


VD>Привожу код еще раз.


VD>
VD>for(;;)
VD>{
VD>  for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; 
VD>             pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
VD>  {
VD>    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
VD>    {
VD>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
VD>                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
VD>       if(nRes != CCB_ERR_NOERROR)
VD>       {
VD>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
VD>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
VD>            //Передается юзеру, который должен как-то отреагировать на ошибку
VD>            nCallBackRes = pCheckControl->DoControl(nRes); 
VD>            nErrorCount++;
VD>            
VD>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
VD>               continue; //OK, продолжаем дальше
VD>            else if(nCallBackRes == CCB_RES_ABORT) 
VD>               return nErrorCount; //Failed, отмена
VD>            else 
VD>               //Юзер попытался исправить ошибку, надо проверить заново
VD>               break;
VD>       }
VD>   }
VD>}
VD>





Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

Можно так:
for(;;)
{
  for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; 
             pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
    if(pRecord3 == NULL)break;
}


Но это лишние извраты!
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 03.06.02 12:46
Оценка: 6 (1)
Здравствуйте WolfHound, Вы писали:

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


S>>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.


WH>
WH>int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
WH>{
WH>    HANDLE    mutex_lock=NULL;
WH>    MSG        msg;
WH>    char *s=NULL;
WH>    char st[1000];

WH>    msg.wParam=1;
WH>    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
WH>    if(GetLastError()==ERROR_ALREADY_EXISTS)
WH>        goto st_app_already_exists;
WH>    if(mutex_lock==NULL)goto st_fail;

WH>    app_hInstance = hInst;

WH>    WNDCLASS wnd_class;

WH>    wnd_class.style=            CS_PARENTDC;
WH>    wnd_class.lpfnWndProc=        WndProc;
WH>    wnd_class.cbClsExtra=        0;
WH>    wnd_class.cbWndExtra=        0;
WH>    wnd_class.hInstance=        app_hInstance;
WH>    wnd_class.hIcon=            NULL;
WH>    wnd_class.hCursor=            NULL;
WH>    wnd_class.hbrBackground=    NULL;
WH>    wnd_class.lpszMenuName=        NULL;
WH>    wnd_class.lpszClassName=    app_wnd_class_name;

WH>    if(!RegisterClass(&wnd_class))goto st_fail;

WH>    app_hWnd = CreateWindow(
WH>        app_wnd_class_name, app_window_name,WS_POPUP,
WH>        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
WH>        NULL,    NULL,    app_hInstance,    NULL
WH>    );

WH>    if(app_hWnd==NULL)goto st_fail;

WH>    ShowWindow(app_hWnd, SW_SHOW);
WH>    SetCursor(LoadCursor(NULL, IDC_ARROW));
WH>    ShowCursor(TRUE);

WH>    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
WH>    if(!app_timer)goto st_fail;

WH>    app_ready=1;
WH>st_message_loop:
WH>    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
WH>    if(app_active&&app_ready)goto st_work;
WH>    WaitMessage();
WH>    goto st_message_loop;
WH>st_check_message:
WH>    if(msg.message==WM_QUIT)goto st_quit;
WH>    TranslateMessage(&msg);
WH>    DispatchMessage(&msg);
WH>    goto st_message_loop;
WH>st_work:
WH>//=====================================================================
WH>//...
WH>//=====================================================================
WH>    goto st_message_loop;
WH>st_fail:
WH>    if(app_timer)            KillTimer(app_hWnd, app_timer);
WH>    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
WH>st_quit:
WH>st_app_already_exists:
WH>    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
WH>    return msg.wParam;
WH>}

WH>


WH>Да если кто-то код не разобрал спршивайте не стесняйтесь.

WH>ЗЫ жаль оценки -10 нету.
WH>ЗЗЫ извините вырвалось.

Мдя... Неужели ТАК еще кто то пишет...
Все гениальное — просто
Re[12]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 04.06.02 15:25
Оценка: 6 (1)
Привет, Игорь. Я ждал твоего появления. ;)


AS>>Ну и последнее. По поводу надуманности примеров, где goto реально помогает. На мой взгляд, даже в Windows-программировании такие случаи бывают. Вот самый что ни есть типичный сценарий (напоминаю, пока мы остаёмся в рамках C):


AS>>
IT>void foo()
IT>{
IT>...
IT>   // Работаем с данными

IT>failure:
IT>   bResult = FALSE;

IT>cleanup:
IT>...
IT>   return bResult;
IT>}
IT>


IT>Во-первых. Ты всё же зря не привёл ни одного примера goto здесь. В большинстве случаев, он не используется напрямую, для него пишутся макросы в которые он заворачивается вместе и if'ом и установкой кода ошибки. Да и сами метки делаются макросами и имеют всегда предопределённые имена.


Не очень понятно, к чему всё это. Можно конкретный пример?


IT>Во-вторых. Эта техника призвана решать одну проблему старого C, которая заменяется в C++ деструкторами (и не надо нас уговаривать оставаться в рамках C навсегда ;o) ) Я уверен, что большинство примеров, о которых ты говорил используют goto именно для этих целей. Это всего лишь попытка имулировать деструкты, больше ничего, вынужденная мера для обхода ограничений языка. В конце концов о jmp в ассемблере никто не спорит. Но это далеко не использование goto для построения самой логики приложения, как нам предлагает WolfHound. А мы, как я понимаю, спорим именно об этом.


Не знаю на счёт "мы", а я спорю не об этом. Спагетти-код, который нам предложил WolfHound, я не одобряю. В своё время я наелся такими программами на ZX-Spectrum, и мне их вполне хватило. Спорю я в основном с Владом, а именно со следующими его утверждениями.

1. goto не следует использовать никогда и ни при каких обстоятельствах (в том числе в случае с вложенными циклами, с которых мы начали). Моё мнение: иногда можно.
2. goto автоматически порождает нечитабельные и плохо поддерживаемые/расширяемые программы. Моё мнение: не обязательно, хотя часто.
3. Если человек использует goto, то он — ламер (и далее рассуждения о том, что это как норкотик и т. д.) Моё мнение — не факт (кстати, см. результаты голосования на текущий момент). Просто нужно пользоваться с умом. Впрочем, это касается и любых других средств языка C++.


IT>В-третьих. Я ещё могу привести пример, где широко используется goto примерно для таких же целей. Написание COM-объектов на чистом API, установка HRESULT и выход из метода. Но что-то никто не хвалит эту технологию как продвинутую, все пишут на ATL. Не потому ли, что старый подход с goto глюкастее и сложнее?


Вполне возможно. Когда без goto лучше, чем с ним, избавляйся на здоровье. Цель программиста — написать хорошую программу. Какие средства для этого используются — безразлично. Критерии "хорошести" тоже могут быть разными (см. моё предыдущее письмо), но это уже отдельный разговор.


IT>В-четвёртых. Можно тот же код с очисткой ресурсов написать и без всего этого. Я писал на C года четыре и прекрасно обходился без подобной техники. Можем проверить, давай код с goto, я его перепишу на if'ы. ;o)


Я и сам могу. Вопрос, будет ли твой вариант более читабельным. Думаю, что совсем не обязательно.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[12]: А такие варианты
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.06.02 04:21
Оценка: 6 (1)
Здравствуйте Patalog, Вы писали:

P>Vlad, а ты не думаешь, что изменение переменной цикла внутри цикла вешь более взрывоопасная, чем goto?


Ну хорошо, а такие варианты?

Пример А (приемлемый, с goto, улучшенный вариант исходного: изменено имя метки, метка помещена внутрь блока как используемая "локально" (это, конечно, фигня — всё равно она видима "глобально", но, по крайней мере, такая техника имеет право на жизнь)
{
repeat_after_correction: //После коррекции, надо проверить заново

    for( SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory )
    {
        if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel)
        {
            nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
            if(nRes != CCB_ERR_NOERROR)
            {
                pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
                pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
                nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
                nErrorCount++;
            
                if(nCallBackRes == CCB_RES_ABORT)
                {
                    return nErrorCount; //Failed, отмена
                }
                else if(nCallBackRes != CCB_RES_MAKEAUTO && nCallBackRes != CCB_RES_IGNORE)
                {
                    goto repeat_after_correction; //Юзер попытался исправить ошибку, надо проверить заново
                }
            }
        }
    }
}

Пример Б (полностью структурированный)
{
    SDirectoryRecord* pRecord3;
    do
    {
        for( pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory )
        {
            if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel)
            {
                nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
                if(nRes != CCB_ERR_NOERROR)
                {
                    pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
                    pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
                    nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
                    nErrorCount++;
            
                    if(nCallBackRes == CCB_RES_ABORT)
                    {
                        return nErrorCount; //Failed, отмена
                    }
                    else if(nCallBackRes != CCB_RES_MAKEAUTO && nCallBackRes != CCB_RES_IGNORE)
                    {
                        break; //Юзер попытался исправить ошибку, надо проверить заново
                    }
                }
            }
        }
    } while( pRecord3 != NULL );
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[19]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 06.06.02 08:40
Оценка: 6 (1)
Здравствуйте The Lex, Вы писали:

S>>>>Не, не надо путать причину со следствием. Тут не готу у человека отбирать надо, а конкретно дать ему по башке, чтоб выучил новый язык.


TL>>>Я всегда считал, что для того чтобы выучить новый язык, необходимо научиться думать на нем, мыслить его категориями. Разве не так?


S>>Так, но причем здесь это? Разве запрет на использование goto заставит думать новыми категориями?


TL>Запрет на использование родного языка на уроках иностранного широко применяется и, судя по всему, весьма эффективен.


Демагогия. Попробуй тогда учить белорусский язык, зная русский (да и в этом случае отличия принципиальные). Да и запрет одного слова не равен запрету языка. Тут, IMHO, наиболее подходящее "лингвистическое" сравнение — обучение хорошему стилю написания поэзии на итальянском языке человека, умеещего писать прозу на церковной латыни путем запрета употребления слова amen.

S>>В данном случае (для очистки ресурсов) в С есть другие средства, например, лесенка if'ов. Скорее переучиваемый прибегнет к ним, чем к классам-оберткам. Так что запрет на использование goto — полумеры. Раз уж мы говорим о коде в ATL, то налицо или упорное нежелание людей, его писавших, переучиваться, поскольку писался код именно под С++, или применение методики программирования, известной как Copy'n'Paste.


TL>:) Ну, теперь мы начинаем сваливаться в сторону технологий изучения языков, языков программирования в т.ч.


Ну дык! С самого начала к этому шло ;)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[10]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 17.10.02 15:26
Оценка: 5 (1)
Здравствуйте Anton V. Kolotaev, Вы писали:

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


AVK>

DG>>А если это был не двухмерный массив, а коллекция, элементы которой тоже содержать коллекции?
DG>>

DG>>foreach(Item item in Items)
DG>>{
DG>>  foreach (ChildItem childItem in item.ChildItems)
DG>>  {
DG>>    if (childItem.IsBad)
DG>>      break;

DG>>  }
DG>>}
DG>>


AVK>С++ уже забываем?


А в C++ тут вааще std::find_if рулит

DG>>Каждый раз под такую фигню писать хитрый итератор?


Кстати, с boost::iterator_adaptor это очень часто становится почти тривиальным

AVK>В идеале — да.


DG>>И код от этого станет более структурированным?


AVK>Думаю, что да.


DG>>А если нужен более хитрый обход, например, с возратами и т.д., а не просто последовательный?


AVK>Ага, и итератор — лучшее место, где спрятать эту хитрость.


Не, таки не всегда. Если просто дерево или какой другой дурной контейнер обойти — это одно дело, тут итераторам самое место. А вот если в уикле какая-нибудь чумовая математика сидит, break n не помешал бы. Хотя лично мне goto вполне хватает
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 17.09.04 06:26
Оценка: 4 (1)
Здравствуйте, Undying, Вы писали:

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


J>>к большому сожалению, циклы редко пишутся отдельно от остального кода.

J>>обычно в них используется штук 20 внешних по отношению к циклу переменных.

U>Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.


что-то я не понял, каким образом можно введением новых функций избавиться от переменных.

Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.

рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 05:01
Оценка: 3 (1)
Здравствуйте m.a.g., Вы писали:

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


P>>Здравствуйте m.a.g., Вы писали:


...>>>Кстати, даже добавление break (не говоря уж о goto) к структурному программированию портит всю теоретическую картину — рушится весь конструктивизм и многие теоремы существования. Кстати, многие неудобные места в современных языках программирования — это просто следствия из неправильного теоретического проектирования языка.


P>>Мсье теоретик?


...>Просто грамотный специалист, знающий не только прагматику и методологию, но и теорию. Кстати, я слегка ошибся, добавление break картины не портит, ее портит добавление break(n) или goto из внутреннего цикла.


P>> Объясните популярно, что есть "рушится весь конструктивизм и многие теоремы существования"?


...>Надеюсь, все знают, что такое интуиционистская логика и естественный вывод?


Боясь, я не знаю. А что надо?

...>Формализацией break(n) является "правило приятной неожиданности" (ппн): во внутреннем подвыводе доказана цель внешнего. Доказательство допустимости такого правила в классической логике строится по построению вывода и не представляет интереса.


...>Докажем, что (ппн) превращает интуиционистскую логику в классическую: для этого достаточно показать выводимость закона исключенного третьего:


...>* (A => B) => A

...>| * A
...>| | B
...>| A => B
...>| A
...>((A => B) => A) =>A

...>откуда следует закон исключенного третьего.


...>Конструктивизм разрушен.


Снимаю шляпу.

Только к чему все это? Неужели "интуиционистская логика и естественный вывод" так часто применяется в кодировании? Может я тоже ее применяю, но просто не знаю об этом?
Pls, обьясни поподробней. Если подкинешь ссылки, будет просто Только, как говориться, для чайников. Ну не теоретик я И методологию не учил

P>>И как эту задачу решить с точки зрения "правильного теоретического проектирования".


...>Переписать код так, чтобы этой проблемы не возникало.


Так у меня никакой проблемы и не возникает. Похоже она возникает у тех кто пытается переписать код в соответствии с "правильным теоретическим проектированием".
Почетный кавалер ордена Совка.
Re[6]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 27.05.02 11:00
Оценка: 2 (1)
А>Я обычно делаю так:
А>
А>bool bContinue = true;
А>while(bContinue) {
А>  for(int i = 0; i < 100; i++) {
А>    if (i == 77) {
А>      bContinue = false;
А>      break;
А>    }
А>  }
А>}
А>


Я в общем то так и делаю, только подумалось, что можно по-другому...
Re: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 31.05.02 20:38
Оценка: 2 (1)
Здравствуйте LeonGorbachev, Вы писали:

Еще вариант:

void a_function(..) {
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
         return;
LG>  }
LG>}
}
GS
Re[5]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.10.02 23:17
Оценка: 2 (1)
Здравствуйте Anton V. Kolotaev, Вы писали:

P>>1) слово breakbreak лучше показывает, что происходит на самом деле


AVK>Хорошо, а как ты будешь из 3, 4 циклов выходить? А из n?


Да ты не заходит так далеко.

А вообще можно было придумать break(xxx). Где xxx — глубина выхода.
... << RSDN@Home 1.0 alpha VladD2.1.0.alpha 12.1.0.1019.39707 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.02 11:33
Оценка: 1 (1)
Здравствуйте The Lex, Вы писали:

P>>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


TL>Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...


2ALL:

Я теперь все кому не зслужено, или в отместку ноль залепили буду самую высокую оценку довать. Даже если ответ и не выдающийся, а просто верный. Так что перед тем как сделать пакость, человеку луше подумать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Выйти из двух циклов сразу
От: postmaster  
Дата: 17.09.04 13:13
Оценка: 1 (1)
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


while(1)
{
  for(int i = 0; i < 100; i++)
  {
    if(i == 77)
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
      goto l1;
  }
}
l1:


Читать >350 сообщений лень.
Re[5]: Выйти из двух циклов сразу
От: Undying Россия  
Дата: 17.09.04 16:38
Оценка: 1 (1)
Здравствуйте, jazzer, Вы писали:

U>>Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.


J>что-то я не понял, каким образом можно введением новых функций избавиться от переменных.


Введением новых функций избавиться от переменных, конечно, не получится, но вот снизить сложность кода можно, т.к. в каждую из нескольких функций уже будет передаваться не двадцать параметров, а значительно меньше.

J>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.


Чтобы избавиться от количества переменных, нужно объединить десять массивов в несколько объектов, внешние параметры также нужно сгруппировать и объединить в объекты. Функции перелопачивания в этом случае станут составной частью объектов содержащих массивы. В результате код вместо явного использования двацати переменных будет выглядеть как вызовы методов нескольких объектов, в каждый из которых передается небольшое количество параметров, а уж сколько свойств переданного параметра используется внутри метода нам по барабану, хоть тысячу.

J>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления


Рефакторинг — это не только модное и красивое слово, но также и весьма полезное на практических задачах.
... << RSDN@Home 1.1.2 stable >>
Re[6]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 17:17
Оценка: 1 (1)
Здравствуйте, Undying, Вы писали:


U>Введением новых функций избавиться от переменных, конечно, не получится...

Ну почему же? Очень даже получится... Если переменная используется один раз, то вместо нее можно вставить вызов ф-ции, производящей расчет значения этой переменной, подобно тому, как это делалось при её инициализации. Для тех, кто спросит: "а зачем это надо?", заранее отвечу, что выигрыш в том, что:
1) эта ф-ция может быть явно описана, как не имеющая побочных эффектов (а переменная может изменяться) и, таким образом, упростится понимание алгоритма.
2) эта ф-ция может быть использована повторно
3) упростится проведение других рефакторингов
Даже если значение переменной используется несколько раз, можно забить на оптимизацию и всеравно сделать ф-цию.
Обо всем этом хорошо написано у Фаулера...

U>, но вот снизить сложность кода можно, т.к. в каждую из нескольких функций уже будет передаваться не двадцать параметров, а значительно меньше.


J>>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.


U>Чтобы избавиться от количества переменных, нужно объединить десять массивов в несколько объектов, внешние параметры также нужно сгруппировать и объединить в объекты. Функции перелопачивания в этом случае станут составной частью объектов содержащих массивы. В результате код вместо явного использования двацати переменных будет выглядеть как вызовы методов нескольких объектов, в каждый из которых передается небольшое количество параметров, а уж сколько свойств переданного параметра используется внутри метода нам по барабану, хоть тысячу.


J>>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления


U>Рефакторинг — это не только модное и красивое слово, но также и весьма полезное на практических задачах.


Со всем согласен!!!
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[4]: Выйти из двух циклов сразу
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 27.05.02 12:04
Оценка: :)
Здравствуйте Рек, Вы писали:

Рек>А делать так не надо, потому что исключение это дорогое средство и должны

Рек>происходить редко (так в книжках пишут), слно алгоритмы с их помощью реализовывать не нужно,
Рек>только обработку ошибок.

Есть еще способ с использованием __leave у Microsoft, и им некоторые писатели книжек пользуются, но тогда SEH надо привлекать, что часто невозможно/трудно.

Рек>Если с души воротит от goto, то можно оформить внутренний цикл как функцию

Рек>и делать из неё return вместо goto.

Стоит добавить, что для встроенной функции никакого оверхеда не будет (если она компилятору понравится, конечно), а способ самый красивый. Но с добавочной переменной типа bool — еще красивее. Не так наглядна декомпозиция алгоритма, но зато потерь в производительности не будет.
Алексей Кирдин
Re[7]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.02 22:21
Оценка: +1
Здравствуйте Vladik, Вы писали:

V>P.S. Лично я из принципа goto никогда не поставлю (просто рука не поднимется Но увидев чужой кусок кода именно с "таким" goto ничего плохого про написавшего его не подумаю.


Я знаю только одну ситуацию когда goto может быть оправданным. Это обработка ошибок без try/catch. Но более красиво (и главное безапасно) будет сделать для каждого типа ресурса класс-обертку и вообще избежать очистки.

Повторюь еще раз. goto не структурированный оператор. И его ипользование вност хаотичность в код. У нас в конторе написано ~ 300 000 рабочего кода (не считая кода к статьям) на C++ и goto не разу не применялся. Один программист как то раз начал отстаивать точку зрения "что в его случае лучше применить goto" и рьяно так... но когда мы переписали его код, он и сам согласился, что так элегантнее, понятее и безопаснее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 31.05.02 04:53
Оценка: -1
Здравствуйте VladD2, Вы писали:

Хм, ну раз пошла такая пьянка... Видимо все таки етот вопрос нужно прояснить до конца. Надеюсь господа модераторы все же не сочтут флеймом.

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


P>>А по подробнее про "его случай" мона? Например кусочек его и вашего кода...


VD>Это было в 97-ом. Так что теперь и не вспомнить.


P>>И каким образм вносит хаотичность (ежели конечно не ставить в каждой строчке)?


VD>В том, что он вносит не сруктурированную логику в логику программы. При этом правила чтения исходнико можно выбрасить на памойку, так как в любой >строчке может ждать непредвидееное поведение. Причем если goto на кождом шагу, то на это рссчитываешь, а вот если это назаметно вставленный подарок,


Тю, слово то какое страшное "не сруктурированную логику" И хде можно почитать "правила чтения исходнико"?
В чем непредвиденное поведение? В терминах эхотага ето видимо нечто совсем кошмарное

Видимо все таки нужно определиться с терминами. Что в твоем понимании "не структурированная логика"? А что "структурированная"?

>то мжно часми сидеть над чужим кодом не понимая почему он работает именно так. Кстаити, по тем же причинам не стоит применять кострукции типа:

VD>if(a = b)
VD>И предпочитать проверки в циклах отдельным if-ам.

Часами можно сидеть над исходниками линухового cdrtools (Ето я о наболевшем). Кстати goto я там не видел...

P>>ЗЫж Еще раз повторюсь, какие причины _кроме_ чисто эстетических (может и неверное слово подобрал существуют для того чтобы не использовать goto?

P>>Про то что он де не структурированный и т.д. я уже слышал, и не один раз.

VD>Физических причин нет. Можно даже сделать ассемблерную всавку и осуществить дальний переход из любого места программы. Практика показывает, что обычно чем выше класс программиста тем реже реже в его коде можно встретить goto...


Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...
Почетный кавалер ордена Совка.
Re[14]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 31.05.02 07:44
Оценка: :)
Здравствуйте The Lex, Вы писали:

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


P>>Здравствуйте The Lex, Вы писали:


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


P>>>>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


TL>>>Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...


P>>Принеси песочку, родной... (с) Киндза-дза.


TL>Ку-у-у


Надо два раза, могу штаны показать. А то и яцелопу нажалиться...

P>>Не хочешь разводить флейм — не разводи. Тред плавно перешел на _стиль_ написания программ, что как заметил Vlad, может представлять определенный интере. А про класс начал не я, ежели ты вдруг не заметил.


P>>Ежели прога кривая, ее конечно нужно сопровождать, поддерживать и модифицировать. Сие не означает, что хорошую прогу не надо сопровождать etc., это к тому, что при прочих равных, класс выше у того у кого работает, а не у того кто круче заплатки клепает.


TL>"Заплатки клепать" приходится в любом случае. И чем проще "клепать заплатки", тем лучше. Причем "клепать заплатки" не всегда приходится тому же, кто "хорошую прогу" писал.


Ну, не знаю мне пока не приходилось... В смысле именно заплатки. Модифицировать — да. Чем проще, тем лучше — с этим никто не спорит. Это лмшь говорит о грамотности проектирования.

TL>Так что: обсудим, у кого же "класс выше"? Т.е. методы определения "высоты класса".


А енто теперь так называется? Раньше вроде пиписками мерялись...

Не, ну так точно флейм получится А определения "высоты класса" у меня нет. Может спросить у Vlad'a? Имхо, он сказал что чем выше класс, тем меньше goto.

Кстати, а было бы неплохо узнать мнение all о "высоком классе", типа как определяетя, из чего складывается и т.д. Но ето кажется в более другой топик, типа в "Прочее". Как насчет?

P>>ЗЫж Жаль сдесь твита нет...


TL>Мне тоже жаль. А кто это?


Да так приятель один... Они обычно вместе с голым дедом ходят
Почетный кавалер ордена Совка.
Re[4]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 02.06.02 18:33
Оценка: -1
Здравствуйте DarkGray, Вы писали:

DG>Интересно, почему мне намного больше нравится следующий код?

А мне нет особенно после того как я вспоминаю про скрытый код о котором (кроме интерфейса) я ни чего не знаю.
DG>И почему очень не нравится предыдущий код, особенно, если бы его писал мой подчиненный...
И почему-бы я не стал работать на босса которого интересует как выглядит мой код, а не то как он работает.

DG>ИМХО, с таким стилем кода сложно писать большие приложения.

Просто особенно после того как автокомментирование врубается.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 03.06.02 18:48
Оценка: -1
Здравствуйте WolfHound, Вы писали:

WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.

Самым умным я себя не считаю, но глядя на твой паршивый (извините за такое выражение) код, я вылез после душа
и не смог удержаться и не переписать его.
В общем-то вот такой код я считаю более читабельным и более правильным...

// -----------------------------------
// LeonGorbachev 04.06.2002 / 23:38:32
typedef enum 
{
    ERR_ST_FAIL,
    ERR_ST_QUIT,
    ERR_ST_ALREADY_EXIST,
} _ST_ERRORS;

void _check_mess(MSG *pmsg)
{
    if(pmsg->message == WM_QUIT)
        throw ERR_ST_QUIT;
    TranslateMessage(pmsg);
    DispatchMessage(pmsg);
}

void _work()
{
    //=====================================================================
    //...
    //=====================================================================
}

void _message_loop(MSG *pmsg)
{
    while(1)
    {
        if(PeekMessage(pmsg, NULL, 0, 0, PM_REMOVE))
            _check_mess(pmsg);
        if(app_active && app_ready)
            _work();
        WaitMessage();
    }
}

int APIENTRY WinMainEx(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    HANDLE    mutex_lock=NULL;
    MSG        msg;
    char *s=NULL;
    char st[1000];
    try
    {
        msg.wParam=1;
        mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
        if(GetLastError()==ERROR_ALREADY_EXISTS)
            throw ERR_ST_ALREADY_EXIST;
        if(mutex_lock==NULL)
            throw ERR_ST_FAIL;
        app_hInstance = hInst;
        WNDCLASS wnd_class;
        wnd_class.style=            CS_PARENTDC;
        wnd_class.lpfnWndProc=      WndProc;
        wnd_class.cbClsExtra=       0;
        wnd_class.cbWndExtra=       0;
        wnd_class.hInstance=        app_hInstance;
        wnd_class.hIcon=            NULL;
        wnd_class.hCursor=            NULL;
        wnd_class.hbrBackground=    NULL;
        wnd_class.lpszMenuName=     NULL;
        wnd_class.lpszClassName=    app_wnd_class_name;
        if(!RegisterClass(&wnd_class))
            throw ERR_ST_FAIL;
        app_hWnd = CreateWindow(app_wnd_class_name,
            app_window_name,WS_POPUP,
            0,    0,    GetSystemMetrics(SM_CXSCREEN),
            GetSystemMetrics(SM_CYSCREEN),
            NULL,    NULL,    app_hInstance,    NULL
            );
        if(app_hWnd==NULL)
            throw ERR_ST_FAIL;
        ShowWindow(app_hWnd, SW_SHOW);
        SetCursor(LoadCursor(NULL, IDC_ARROW));
        ShowCursor(TRUE);
        app_timer = SetTimer(app_hWnd, APP_TIMER_ID, 1000/60, NULL);
        if(!app_timer)
            throw ERR_ST_FAIL;
        app_ready = 1;
        _message_loop(&msg);
    }
    catch(_ST_ERRORS err)
    {
        switch(err)
        {
        case ERR_ST_FAIL:
            {
                if(app_timer)
                    KillTimer(app_hWnd, app_timer);
                if(app_hWnd != NULL)
                    DestroyWindow(app_hWnd);
            }
        case ERR_ST_QUIT:
            {
            }
        case ERR_ST_ALREADY_EXIST:
            {
                if(mutex_lock!=NULL)
                    CloseHandle(mutex_lock);
            }
        }
    return msg.wParam;
    }
    catch(...)
    {
        return -1;
    }
    return 0;
}
// -----------------------------------


А по поводу работодателя, который смотрит в код —
чесно говоря, я бы такого работника достаточно быстро уволил бы... хотя это мое ИМХО
Re[5]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 04.06.02 14:31
Оценка: -1
Здравствуйте Patalog, Вы писали:

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


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


P>>>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических?


VD>>С давних пор луди стали замечать, что если придерживаться некоторой стратегии, то дела идут лучше, а удача чаще приходит в их дом. В программировании одной из таких стратегий является структурное программирование.


P>>>Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


VD>>goto оператор неструктурного программирования. Стоит применить его один раз как захочется еще и еще... Читать такой код значительно сложнее. Научивщись же обходится без оного по прошествии некоторого времени начинаешь задаваться другим вопросом... Зачем нужен этот оператор?!


P>Sorry читаю в нитевом режиме по этому сначало ответил на 29.05.02 03:21:39, а теперь только добрался до этого...


P>Хотя смысла это не меняет. Мне эта gotoфобия в плане структурного программирования сильно напоминает желание ООПшников все и вся превратить в объекты.

P>Мне кажется ето дело вкуса либо каких-то корпоративных правил\соображений. В первом случае — "De gustibus et coloribus non est disputandum" (с), во втором — "Против танка не попрешь" (с).

P>

P>equal:
P>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
P>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
P>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
P>       if(nRes != CCB_ERR_NOERROR) {
P>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
P>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
P>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
P>            nErrorCount++;
P>            
P>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
P>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
P>            else goto equal; //Юзер попытался исправить ошибку, надо проверить заново
P>       }
P>   }
P>}

P>


P>IMHO, ежели у кого-то возникают проблемы с чтением этого кода, енто личные проблемы этого кого-то. У меня это единственный случай, когда я использовал goto (к вопросу о "Стоит применить его один раз как захочется еще и еще"), и _мне_ это показалось более красивым решением, чем городить еще кучу циклов\функцый\сравнений\флагов.


P>ЗЫж Похоже все-таки тема вырождается во флейм.


P>ЗЗЫж 2DarkGray: В каких случаях и какие "Компиляторы иногда путаются с goto, и могут не правильно вызывать конструкторы\деструкторы."


for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR) {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
            else
            {
                pRecord3 = pRecord1->m_pFirstRecord; //Юзер попытался исправить ошибку, надо проверить заново
                continue;
             }
       }
   }
}


Я бы так написал, а как другие пишут мне глубоко по барабану, лишь бы не мне читать и править.
Но в данном конкретном случае оба варианта имеют право на жизнь.
Хотя если бы не комментарий в ключевой строке, дольше бы понимал суть.
Все гениальное — просто
Re[13]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 21:22
Оценка: -1
Здравствуйте Patalog, Вы писали:

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


Не, все проще... Бывает когда и халява проктывает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 13:03
Оценка: :)
Здравствуйте George_Seryakov, Вы писали:

GS>Автоматизация программирования для предметной области. Мне такое не интересно. Хотя коммерчески может быть весьма успешным: САПР Бухгалтерия! САПР Отчеты по бухгалтерии! САПР Отчеты в налоговую! САПР Левая бухгалтерия! САПР Кадры! САПР Крупный банк! САПР Мелкий банк! и т.д. и т.п., и за все бабки.


GS>И куда только вся эта тьма наглюканых бухгалтерий потом деваться будет?


Не... я под предметной областью понимаю: управление предпиятем, статистика. Видишь как сегодня разрабатываются игры? Обычно пишется энжин и редактор. Причем редактор является CASE-средством. Но не убогим вроде Розы, а способным выдовать конечные продукты. Вот хочется нечто подобное только для других областей. Конечно здорово было бы создать универсальный энжин и унивесальный редактор, но пока я реальных путей решения этой проблемы не вижу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 05.06.02 16:20
Оценка: -1
Здравствуйте VladD2, Вы писали:

VD>Вот тебе цитата из Лингво:

VD>
VD>CASE  
VD>сокр. от computer-aided software engineering  
VD>автоматизированное проектирование и создание программ
VD>


VD>Так как игра это программа, а редактор позволяет ее создавать, то значит является.


А что Лингво говорит по поводу goto? Тоже, небось, какую-нибудь ересь...

VD>А мне проектирование ради проектирования не нужно. Мне результат нужен.


А мне кодирование ради кодирования не нужно. Сколько ты "проектируешь"? 1% времени? Никому больше это не говори. Правильные пацаны проектируют от 10 до 50 % времени.

GS>>Самое универсальное, что есть — операционные системы, компонентые модели и ЯВУ. Во что-то другое типа универсального движка/редактора я не верю, даже для управления предприятием и/или игр. Для полноты хотелось бы добавить, что не верю и в неуниверсальные энжины/редакторы, но это будет уже перебор.


VD>Что в них верить, то? Поставь себе Кваку или Старкрафт и убедись. Они универсальны для своей области.


"Они летают, но низэнько-низэнько..."

VD>А в Яву я не верю. Это всего лишь еще один язык программирования. Переносимость мне не нужна...


А я не верю в веру и неверие.
GS
Re[30]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 06:19
Оценка: +1
Здравствуйте George_Seryakov, Вы писали:

GS>Автоматизация программирования для предметной области. Мне такое не интересно. Хотя коммерчески может быть весьма успешным: САПР Бухгалтерия! САПР Отчеты по бухгалтерии! САПР Отчеты в налоговую! САПР Левая бухгалтерия! САПР Кадры! САПР Крупный банк! САПР Мелкий банк! и т.д. и т.п., и за все бабки.


По моему скромному мнению уже есть подобные прецеденты. Далеко ходить не надо: что вы скажете насчет систем управления веб-контентом? САПР сайта. Кто сказал, что HTML/DHTML/ServerScripts — это не программирование?
Голь на выдумку хитра, однако...
Re[17]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 10.06.02 09:12
Оценка: :)
Здравствуйте m.a.g., Вы писали:

S>>Ну, сравни производительность труда "бывалого ассемблерщика" и среднего "программиста на С++" при программировании на С++. То, к каким идиомам человек привык, конечно, играет роль, но не ключевую — увидит более удобную, привыкнет и к ней. Это как с аппликатурой при игре на гитаре — если сразу научили правильно ставить пальцы, играть тебе будет проще. Если же нет, возможно, разовьешь большую гибкость пальцев, но играть все равно будешь хуже, если ты, конечно, не гений. Идиомы не на пустом месте возникли, они отражают возможности "среднего" человека, хорошо это или плохо.


...>Если уж продолжать метафоры, то C++ — это не гитара, а некий инструмент, превращаемый хоть в баян, хоть в балалайку, хоть в саксофон. И иметь возможность воспользоваться всей силой C++ — это уметь играть на всех этих инструментах. Тогда твои слова звучат так: "поскольку большинство людей пользуется C++ как губной гармошкой, то нужно при работе с C++ в качестве рояля держать рояль двумя руками, прикладывать ко рту и дуть в него".


Ну это уже демагогия пошла — аналогия совершенно некорректная. Попробуй на С++ писать как на прологе.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Выйти из двух циклов сразу
От: neutrino  
Дата: 16.10.02 07:29
Оценка: +1
Здравствуйте OlegO, Вы писали:

OO>Например сгенерить исключение:


OO>
OO>try
OO>{
OO>   while(1)
OO>   {
OO>     for(int i = 0; i < 100; i++)
OO>     {
OO>       if(i == 77)
OO>          throw 77;
OO>     }
OO>   }
OO>}
OO>catch(int e)
OO>{
OO>   // e==77
OO>}
OO>


это крайне неэффективно, на обработку исключения тратится очень много ресурсов (порядка в 1000 раз медленнее), его нужно выбрасывать только в крайних случаях.
наверняка такой цикл выполняется много раз.
Re[7]: Выйти из двух циклов сразу
От: Anton V. Kolotaev  
Дата: 17.10.02 13:41
Оценка: -1
Здравствуйте DarkGray, Вы писали:

DG>Это намного хуже чем "goto метка" или "break метка", т.к. при добавлении/удалении промежуточных циклов будет разъежаться весь код.


По-моему, проблема настолько надумана, что и яйца выеденного не стоит. Имхо наличие вложенных циклов говорит, скорей всего, о непроработанности дизайна. Например, если ищется элемент в n-мерном массиве, то должно быть не n циклов, а 1 по переменной типа составного итератора.

В некторых случах может быть интересна т.н. "тензорная нотация". Например,
Array<float,2>  a(4,4);

a = 1.0 / (1.0 + tensor::i + tensor::j);  // set a[i,j] = 1/(1+i+j) for every 0 <= i,j < 4


эквивалентно
for (int i = 0; i < 4; i++)
   for (int j = 0; j < 4; j++)
      a(i,j) = 1.0/(1.0+i+j);
Re[11]: Выйти из двух циклов сразу
От: mihailik Украина  
Дата: 21.04.03 07:22
Оценка: -1
AS>В-третьих, по поводу других предложенных методов.
AS>1. Вспомогательная функция+выход по return. Поскольку функции по правилам C могут находиться в любом месте программы (в т. ч. в другом модуле), читателю совершенно непонятно, куда приведёт return. Эту ситуацию можно немного поправить, структурируя код и добавляя комментарии, но это не меняет сути — такой подход не способствует читабельности.

Это что ж, из функций по goto выходить?
Срочно подвесить за это!
... << RSDN@Home 1.0 beta 6a >>
Re[7]: Выйти из двух циклов сразу
От: eaa Украина  
Дата: 23.04.03 13:41
Оценка: :)
Здравствуйте, Areex, Вы писали:

A>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно.

Как можно неявно использовать goto? Или есть goto в коде или нет, а то что оно возможно разложиться в один код, так это только твои догадки...
... << RSDN@Home 1.0 beta 6a >>
Re[11]: Выйти из двух циклов сразу
От: WFrag США  
Дата: 23.04.03 15:05
Оценка: +1
Здравствуйте, Areex, Вы писали:

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


WF>>А еще через goto можно разложить if, do...while, и.т.д.


WF>>Так что это не аргумент. goto есть goto, а не break, continue,...


A>Читай внимательнее. break это goto, а не goto это break.

A>Причем тут твой пример я вообще не понял.

break — это goto,
while — это goto (чуть более завуалированный),
if — goto,
for — goto,
...
... << RSDN@Home 1.0 beta 6a >>
Re: Выйти из двух циклов сразу
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 15.09.04 13:51
Оценка: +1
Здравствуйте, LeonGorbachev, Вы писали:

LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


В Обероне запросто:
LOOP
  (* ... *)
  FOR i := 0 TO 99 DO
    (* ... *)
    IF i = 77 THEN EXIT END;
    (* ... *)
  END;
  (* ... *)
END;

EXIT — оператор выхода из цикла LOOP

Чтобы получить подобный эффект в доисторическом языке программирования Си, для этого цикла заведите отдельную функцию:
void Cycle()
{
  //...
  while(1)
  {
    //...
    for(int i = 0; i < 100; i++)
    {
      //...
      if(i == 77) return;
      //...
    }
    //...
  }
  //...
}

Оператор return будет выбрасывать из любого количества вложенных циклов.
Re[3]: Выйти из двух циклов сразу
От: Undying Россия  
Дата: 16.09.04 14:54
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>к большому сожалению, циклы редко пишутся отдельно от остального кода.

J>обычно в них используется штук 20 внешних по отношению к циклу переменных.

Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.
... << RSDN@Home 1.1.2 stable >>
Re[7]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 11:43
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>что угодно можно обозвать кривым дизайном

J>было бы, конечно, здорово, если бы все задачи были простыми и укладывались в простые диаграммы с очевидной логикой
А для чего было придумано другое умное слово: "декомпозиция". Причем придумано оно уже довольно давно, вовсю используется, даже существуют различные методологии этой самой декомпозиции, как ты думешь, к чему все это? Да, я понимаю, что существует еще другое слово "оптимизация", и, как правило, оно сильно конфликтует с простотой и очевидностью кода, но и на оптимизацию есть стоя управа в виде профайлера. А во время разработки рекомендуется забивать на оптимизацию в пользу простоте и очевидности.

J>только вот реальный мир несколько сложнее, и реальные задачи отнюдь не всегда оказываются легко разложимыми на составляющие

А кто говорил, что все будет просто? Это и есть искусство проектирования ПО.

J>большинство научных вычислительных задач именно таковы

Зато они четко формализованы

J>пример, пожалуйста, применения для озвученного случая

Почитай Фаулера "Рефакторинг". У него там примеров полно.
лэт ми спик фром май харт
Re[9]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 15:25
Оценка: :)
Здравствуйте, jazzer, Вы писали:

J>если я обижусь на изложение банальностей, я буду правильно понят?

Просто тут начали говорить, что параметры в структурах — это дополниельный оверхед и пр. и поэтому это не надо использовать... С чем я не согласен.

V>>Зато они четко формализованы

J>ага. возьми любой алгоритм из линейной алгебры.
Если забить на оптимизацию, писать код по принципу: главное чтобы было просто и работало, думаю, особых проблем с линейной алгеброй не будет.


J>вот ты думаешь, что все тут лохи и никто фаулера не читал и слова "декомпозиция" и "рефакторинг" не слышал?

Фаулера я упомянул, чтобы отмазаться от примеров, а про декомпозицию — это у меня был типа сарказм...

J>И мне встречалось множество примеров, когда рефакторинг никак не пристегнешь.

Поделись. Мне интересно. Правда.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[15]: Выйти из двух циклов сразу
От: Ёрик  
Дата: 19.01.05 16:32
Оценка: +1
Здравствуйте, m.a.g., Вы писали:

MAG>- кто сейчас пишет парсеры вручную? есть же lex/yacc/bison/antlr etc Ведь парсеры — обработка, основанная на

MAG> правилах, структурно писать их не слишком удобно

Ну, мы пишем парсеры вручную. Якк подходит только для ограниченного класса языков.
Re: Выйти из двух циклов сразу
От: fixit  
Дата: 21.01.05 00:00
Оценка: :)
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?



По забрызганной слюнями ярости "колбасе" сообщений данной темы, я понял, что надо ставить goto и не парить себе мозги.
Re[19]: Выйти из двух циклов сразу
От: Max.Subpixel Россия  
Дата: 02.06.06 18:16
Оценка: +1
Здравствуйте, Erop, Вы писали:

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


S>>Ну это уже демагогия пошла — аналогия совершенно некорректная. Попробуй на С++ писать как на прологе.

E>Ты Loki, например, видел?

А ты дату поста посмотрел?
Кто дернул поднимать эту доисторическую тему?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Best Regards. Max.
Re[4]: Выйти из двух циклов сразу
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 05.06.06 07:47
Оценка: +1
Здравствуйте, LeonGorbachev, Вы писали:

LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту.

LG>Чего делать?

1. Не делать два цикла.
2. Не выходить из циклов.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 27.05.02 10:39
Оценка:
Здравствуйте Mishka<T>, Вы писали:

MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.


я вот как раз и не хочу через исключения. И не хочу гоу-ту.
Чего делать?
Re[4]: Выйти из двух циклов сразу
От: Mishka<T> Норвегия  
Дата: 27.05.02 10:42
Оценка:
Здравствуйте LeonGorbachev, Вы писали:

LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту.

LG>Чего делать?

Можно так:
while(1)
{
  for(int i = 0; i < 100; i++)
  {
    if(i == 77)
      break;
  }
  if (i < 100) break;
}
Re[3]: Выйти из двух циклов сразу
От: Рек Россия  
Дата: 27.05.02 10:57
Оценка:
Здравствуйте Mishka<T>, Вы писали:

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


OO>>
OO>>try
OO>>{
OO>>   while(1)
OO>>   {
OO>>     for(int i = 0; i < 100; i++)
OO>>     {
OO>>       if(i == 77)
OO>>          throw 77;
OO>>     }
OO>>   }
OO>>}
OO>>catch(int e)
OO>>{
OO>>   // e==77
OO>>}
OO>>


MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.



То что не надо так делать — это ты прав.
А на счет того, что программа будет завершена — не совсем.

Исключение ведь перехватывется, и из деструктора не выпускаться не будет, потому всё будет работать.

А делать так не надо, потому что исключение это дорогое средство и должны
происходить редко (так в книжках пишут), слно алгоритмы с их помощью реализовывать не нужно,
только обработку ошибок.

По мне так вариант с goto наиболее понятен, слно предпочтителен.

Если с души воротит от goto, то можно оформить внутренний цикл как функцию
и делать из неё return вместо goto.
Re[4]: Выйти из двух циклов сразу
От: slonnik  
Дата: 27.05.02 11:19
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Mishka<T>, Вы писали:



MT>>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.


DG>Не пугай так народ, от и так уже запуганный.


DG>terminate вызывается, только если второй exception не был перехвачен внутри деструктора, чего не наблюдается в данном примере.


DG>Так что выход из вложенного цикла через исключение — нормальная ситуация.


А если не cекрет а почему именно ВТОРОЙ exception и в чем его отличие от первого
Re[6]: Выйти из двух циклов сразу
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 27.05.02 11:51
Оценка:
Здравствуйте Андрей, Вы писали:

MT>>
MT>>while(1)
MT>>{
MT>>  for(int i = 0; i < 100; i++)
MT>>  {
MT>>    if(i == 77)
MT>>      break;
MT>>  }
MT>>  if (i < 100) break;
MT>>}
MT>>


А>Это прокатит только на VC6

Что именно? Scoping? Тогда да. А выход прокатит везде.

2 Mishka<T>
Только это неправильное условие. Надо выйти из циклов при i == 77, а if — совсем другое условие дает (расширяет диапазон значений немеряно).
Алексей Кирдин
Re[7]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 27.05.02 12:01
Оценка:
Здравствуйте Kaa, Вы писали:

Kaa>Здравствуйте Андрей, Вы писали:


А>>Это прокатит только на VC6

Kaa>Что именно? Scoping? Тогда да. А выход прокатит везде.
Что такое Scoping?
Re[6]: Выйти из двух циклов сразу
От: KA it-knowledge-base.blogspot.com
Дата: 27.05.02 16:30
Оценка:
Здравствуйте DarkGray, Вы писали:

[skipped]

DG>Так вот, если при размотке стека при обработке исключения Exception1, окажется, что сгенерировалось еще одно исключение Exception2, которое ловится "выше", чем генериется первое, то у компилятора возникает дилема, какое исключение из этих двух передать в catch. В C++ пошли наиболее простым путем, и грохают всю программу(что очень сильно мешает написанию устойчивых программ), в остальных языках(Java, C#) второе исключение просто игнорируется.


По указанному простому пути идут программы, которые в деструкторах выбрасывают исключения и при этом не вызывают функцию
bool std::uncaught_exception();
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re[7]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 27.05.02 17:28
Оценка:
Здравствуйте KA, Вы писали:

KA>По указанному простому пути идут программы, которые в деструкторах выбрасывают исключения и при этом не вызывают функцию

KA>
bool std::uncaught_exception();


Так обычно выброс исключения происходит не прямо в деструкторе, а в функции, которая вызывается из деструктора. Сама функция может и не предполагать, что ее будут вызывать из деструктора.
В С++ нельзя, например, защититься от обращения по нулевому указателю внутри деструктора, что очень мешает жить программе — 24x7x365.


Предлагаешь завернуть каждый деструктор в такой код. ИМХО, это уже издевательство над программистом, лучше было бы предложить выбрать, какую модель я хочу.
void ~Destructor()
{
try
{
   //bla-bla
}
catch (...)
{
  if (std::uncaught_exception())
  {
    throw;
  }
}
}
Re[3]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 28.05.02 09:22
Оценка:
Здравствуйте Patalog, Вы писали:

P>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


Компиляторы иногда путаются с goto, и могут не правильно вызывать конструкторы\деструкторы.
Re[4]: Выйти из двух циклов сразу
От: Vladik Россия  
Дата: 28.05.02 15:59
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Компиляторы иногда путаются с goto, и могут не правильно вызывать конструкторы\деструкторы.


Предлагаешь ориентироваться на глючные компиляторы? На самом деле "выход из вложенного цикла" (не путать с "прыжком во вложенный цикл — классический пример, когда можно и даже нужно использовать goto. И прежде всего как раз из соображений наглядности, которую так портит goto в более других случаях.

P.S. А вот, может, кто скажет, насколько корректно "прыгать из цикла" наверх, т.е. до начала цикла? Я несколько лет назад с преподом на экзамене поспорил, и он меня не убедил (он утверждал, что это абсолютно некорректно, а вот прыгать "вниз" — типа можно).
Как все запущенно...
Re[6]: Выйти из двух циклов сразу
От: Vladik Россия  
Дата: 28.05.02 18:24
Оценка:
Здравствуйте VladD2, Вы писали:

VD>На самом деле, наличие goto (даже в таких случаях) говорит о слабости проектирования (алгоритма) и не умелом использовании структурных возможностей языка.


Ну зачем столько пафоса?

VD>Всегда можно престроить код так, чтобы небыло операторов goto, циклов while(1) или for(;)... и при этом сделать код даже читабельней и проще. Так что в этой ситуации я бы для начала задался вопросом: а зачем нужен while(1)?


while(1) — это лишь один из случаев (относительно сабжа) и туда действительно просится некий флажок. Конкретный пример я сейчас придумывать не стану, но несколько раз я сталкивался с такими ситуациями, где goto был бы очень даже в тему. Т.е. флажки и вынос в отдельную функцию были менее наглядны.

P.S. Лично я из принципа goto никогда не поставлю (просто рука не поднимется Но увидев чужой кусок кода именно с "таким" goto ничего плохого про написавшего его не подумаю.
Как все запущенно...
Re: Выйти из двух циклов сразу
От: Andrey_007  
Дата: 29.05.02 00:24
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


LeonGorbachev, у меня была похожая проблема, я использовал следующий код:

bool cont=true;

while(cont)
{
for(int i=1;(i<100)&&(cont);i++)
{
if(i==77)
{
cont=false;
}
else
{
//ваш код
}
}
}

если вламы вводить лишнюю переменную, можно использовать следующее:

int i=1;

while(i!=77)
{
for(i=1;i<100;i++)
{
if(i==77)
{
break;
}
else
{
//ваш код
}
}
}

хотя лично я против гоуту ничего не имею, но если можно обойтись без него — так и делаю, и пока не было случая чтоб только вот гоуту и все, мож такой примерчик приведет хто? :) И ище, ПРОГРАММЕРЫ, зрите в ASM, посмотрите, как сделан любой цикл или условие в Вашей программе на ASM'е, ведь там стоит что-нить похожее:
test ecx,ecx
jne 00401d2b,
кто скажет что в ASM'е jne это не тоже, что и на С if(a!=b)goto c:;?

И еще, бороться за использование гоуту в программах бессмысленно, потому что этот страх перед гоуту мы всосали чуть ли не с молоком матери, вспомните любой учебник для начинающих, ведь там без конца долбят: хочешь стать крутым программером, забуть слово гоуту, крутые праграммеры никогда его не используют, потомучто не используют никогда.
Все. Извините, флейма я не хотел, просто прорвало.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 29.05.02 06:09
Оценка:
Здравствуйте VladD2, Вы писали:

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


V>>P.S. Лично я из принципа goto никогда не поставлю (просто рука не поднимется Но увидев чужой кусок кода именно с "таким" goto ничего плохого про написавшего его не подумаю.


VD>Я знаю только одну ситуацию когда goto может быть оправданным. Это обработка ошибок без try/catch. Но более красиво (и главное безапасно) будет сделать для каждого типа ресурса класс-обертку и вообще избежать очистки.


VD>Повторюь еще раз. goto не структурированный оператор. И его ипользование вност хаотичность в код. У нас в конторе написано ~ 300 000 рабочего кода (не считая кода к статьям) на C++ и goto не разу не применялся. Один программист как то раз начал отстаивать точку зрения "что в его случае лучше применить goto" и рьяно так... но когда мы переписали его код, он и сам согласился, что так элегантнее, понятее и безопаснее.


А по подробнее про "его случай" мона? Например кусочек его и вашего кода...
И каким образм вносит хаотичность (ежели конечно не ставить в каждой строчке)?

ЗЫж Еще раз повторюсь, какие причины _кроме_ чисто эстетических (может и неверное слово подобрал существуют для того чтобы не использовать goto?
Про то что он де не структурированный и т.д. я уже слышал, и не один раз.
Почетный кавалер ордена Совка.
Re[4]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 29.05.02 06:38
Оценка:
Здравствуйте VladD2, Вы писали:

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


P>>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических?


VD>С давних пор луди стали замечать, что если придерживаться некоторой стратегии, то дела идут лучше, а удача чаще приходит в их дом. В программировании одной из таких стратегий является структурное программирование.


P>>Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


VD>goto оператор неструктурного программирования. Стоит применить его один раз как захочется еще и еще... Читать такой код значительно сложнее. Научивщись же обходится без оного по прошествии некоторого времени начинаешь задаваться другим вопросом... Зачем нужен этот оператор?!


Sorry читаю в нитевом режиме по этому сначало ответил на 29.05.02 03:21:39, а теперь только добрался до этого...

Хотя смысла это не меняет. Мне эта gotoфобия в плане структурного программирования сильно напоминает желание ООПшников все и вся превратить в объекты.
Мне кажется ето дело вкуса либо каких-то корпоративных правил\соображений. В первом случае — "De gustibus et coloribus non est disputandum" (с), во втором — "Против танка не попрешь" (с).


equal:
for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR) {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
            else goto equal; //Юзер попытался исправить ошибку, надо проверить заново
       }
   }
}


IMHO, ежели у кого-то возникают проблемы с чтением этого кода, енто личные проблемы этого кого-то. У меня это единственный случай, когда я использовал goto (к вопросу о "Стоит применить его один раз как захочется еще и еще"), и _мне_ это показалось более красивым решением, чем городить еще кучу циклов\функцый\сравнений\флагов.

ЗЫж Похоже все-таки тема вырождается во флейм.

ЗЗЫж 2DarkGray: В каких случаях и какие "Компиляторы иногда путаются с goto, и могут не правильно вызывать конструкторы\деструкторы."
Почетный кавалер ордена Совка.
Re[5]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 29.05.02 10:17
Оценка:
P>ЗЗЫж 2DarkGray: В каких случаях и какие "Компиляторы иногда путаются с goto, и могут не правильно вызывать конструкторы\деструкторы."

Это скорее старые компиляторы, сейчас компиляторы просто говорят "compile error" на кривые goto.
Re[9]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.05.02 14:39
Оценка:
Здравствуйте Patalog, Вы писали:

P>А по подробнее про "его случай" мона? Например кусочек его и вашего кода...


Это было в 97-ом. Так что теперь и не вспомнить.

P>И каким образм вносит хаотичность (ежели конечно не ставить в каждой строчке)?


В том, что он вносит не сруктурированную логику в логику программы. При этом правила чтения исходнико можно выбрасить на памойку, так как в любой строчке может ждать непредвидееное поведение. Причем если goto на кождом шагу, то на это рссчитываешь, а вот если это назаметно вставленный подарок, то мжно часми сидеть над чужим кодом не понимая почему он работает именно так. Кстаити, по тем же причинам не стоит применять кострукции типа:
if(a = b)
И предпочитать проверки в циклах отдельным if-ам.

P>ЗЫж Еще раз повторюсь, какие причины _кроме_ чисто эстетических (может и неверное слово подобрал существуют для того чтобы не использовать goto?

P>Про то что он де не структурированный и т.д. я уже слышал, и не один раз.

Физических причин нет. Можно даже сделать ассемблерную всавку и осуществить дальний переход из любого места программы. Практика показывает, что обычно чем выше класс программиста тем реже реже в его коде можно встретить goto...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.05.02 14:59
Оценка:
Здравствуйте Patalog, Вы писали:

P>
P>equal:
P>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
P>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
P>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
P>       if(nRes != CCB_ERR_NOERROR) {
P>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
P>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
P>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
P>            nErrorCount++;
P>            
P>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
P>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
P>            else goto equal; //Юзер попытался исправить ошибку, надо проверить заново
P>       }
P>   }
P>}
P>


Это типичное использование goto для организации цикла. Вот как можно переписать этот код:

for(;)
{

for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord;
pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory)
{
if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel)
{
nRes = CompareRecord(pRecord2, pRecord3, nType) == 0
? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
if(nRes != CCB_ERR_NOERROR)
{
pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
//Передается юзеру, который должен как-то отреагировать на ошибку
nCallBackRes = pCheckControl->DoControl(nRes);
nErrorCount++;

if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE)
continue; //OK, продолжаем дальше
else if(nCallBackRes == CCB_RES_ABORT)
return nErrorCount; //Failed, отмена
else
//Юзер попытался исправить ошибку, надо проверить заново
break;
}
}
}

Такое решение позволяет читающему код легко понять принцип работы программы...

P>IMHO, ежели у кого-то возникают проблемы с чтением этого кода, енто личные проблемы этого кого-то.


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

P> У меня это единственный случай, когда я использовал goto (к вопросу о "Стоит применить его один раз как захочется еще и еще"), и _мне_ это показалось более красивым решением, чем городить еще кучу циклов\функцый\сравнений\флагов.


Тебе показалось.

P>ЗЫж Похоже все-таки тема вырождается во флейм.


А по-моему, многих начинающих она может остановить от привыкания к плохому стилю, так что она полезна. У нас же вроде личной неприязни не возникает?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Выйти из двух циклов сразу
От: VVS  
Дата: 30.05.02 04:43
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?

Ты наверно хотел услышать такой ответ как в PHP:
while(1)
{
  for(int i = 0; i < 100; i++)
  {
    if(i == 77)
      break 2;  
  }
}


Жалко этого в с++ нету.
Re[6]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 31.05.02 05:19
Оценка:
Здравствуйте VladD2, Вы писали:

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


P>>
P>>equal:
P>>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
P>>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
P>>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
P>>       if(nRes != CCB_ERR_NOERROR) {
P>>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
P>>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
P>>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
P>>            nErrorCount++;
P>>            
P>>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
P>>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
P>>            else goto equal; //Юзер попытался исправить ошибку, надо проверить заново
P>>       }
P>>   }
P>>}
P>>


VD>Это типичное использование goto для организации цикла. Вот как можно переписать этот код:


Ну ежели типичное, так [с надеждой] может ничего страшного? А может ето в какой-нибудь паттерн оформить?

VD>for(;)

VD>{

VD> for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord;
VD> pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory)
VD> {
VD> if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel)
VD> {
VD> nRes = CompareRecord(pRecord2, pRecord3, nType) == 0
VD> ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
VD> if(nRes != CCB_ERR_NOERROR)
VD> {
VD> pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
VD> pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
VD> //Передается юзеру, который должен как-то отреагировать на ошибку
VD> nCallBackRes = pCheckControl->DoControl(nRes);
VD> nErrorCount++;
VD>
VD> if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE)
VD> continue; //OK, продолжаем дальше
VD> else if(nCallBackRes == CCB_RES_ABORT)
VD> return nErrorCount; //Failed, отмена
VD> else
VD> //Юзер попытался исправить ошибку, надо проверить заново
VD> break;
VD> }
VD> }
VD>}

VD>Такое решение позволяет читающему код легко понять принцип работы программы...


У нас видимо разные понятия о легкости понятия принципов работы программы...
Кстати, или ето у меня проблемы, или в твоем ответе кусок кода выглядит менее красиво :) Это я о том что табы "съехали"...

P>>IMHO, ежели у кого-то возникают проблемы с чтением этого кода, енто личные проблемы этого кого-то.


VD>Именно проблемы. Но не личные. Личные проблемы начинаются у программиста который пишит такой код... ну, когда он хочет устроиться на работу в контору где ему придется работать в команде.


Тю, мы в разных командах работаем ;) У нас проблемы будут именно у "кого-то". Ибо таких не держим.
У тебя например возникли проблемы с пониманием? Там есть "неопределенное поведение"?

Вас это беспокоит? Вы хотите об этом поговорить? (Это я в НЛП тренируюсь. ;)

Кстати, у вас в команде какие требования к написанию\оформлению? (to All) Поделитесь. Ибо я конечно же погимаю, что с своим уставом, да в чужой монастырь... У меня по етой части опыта мало, работаю всего во 2-й конторе. Зато долго ;)

P>> У меня это единственный случай, когда я использовал goto (к вопросу о "Стоит применить его один раз как захочется еще и еще"), и _мне_ это показалось более красивым решением, чем городить еще кучу циклов\функцый\сравнений\флагов.


VD>Тебе показалось. :)


Ну вот, блин, пора креститься.

P>>ЗЫж Похоже все-таки тема вырождается во флейм.


VD>А по-моему, многих начинающих она может остановить от привыкания к плохому стилю, так что она полезна. У нас же вроде личной неприязни не возникает?


Их у нас пока нет :) Хотя насчет "плохому стилю" уже неплохое начало... :maniac:
Понятие стиль мне кажется пока нет. В смысле есть, но весьма эфемерное. Ибо у каждого свой. И многие умные дяденьки в умных книжках именно так и говорят: дескать упаси боже навязывать вам(читателям) мой стиль написания и т.д. :super:
Почетный кавалер ордена Совка.
Re[12]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 31.05.02 07:17
Оценка:
Здравствуйте The Lex, Вы писали:

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


P>>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


TL>Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...


Принеси песочку, родной... (с) Киндза-дза.
Не хочешь разводить флейм — не разводи. Тред плавно перешел на _стиль_ написания программ, что как заметил Vlad, может представлять определенный интере. А про класс начал не я, ежели ты вдруг не заметил.

Ежели прога кривая, ее конечно нужно сопровождать, поддерживать и модифицировать. Сие не означает, что хорошую прогу не надо сопровождать etc., это к тому, что при прочих равных, класс выше у того у кого работает, а не у того кто круче заплатки клепает.

ЗЫж Жаль сдесь твита нет...
Почетный кавалер ордена Совка.
Re[13]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 31.05.02 07:29
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте The Lex, Вы писали:


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


P>>>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


TL>>Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...


P>Принеси песочку, родной... (с) Киндза-дза.


Ку-у-у

P>Не хочешь разводить флейм — не разводи. Тред плавно перешел на _стиль_ написания программ, что как заметил Vlad, может представлять определенный интере. А про класс начал не я, ежели ты вдруг не заметил.


P>Ежели прога кривая, ее конечно нужно сопровождать, поддерживать и модифицировать. Сие не означает, что хорошую прогу не надо сопровождать etc., это к тому, что при прочих равных, класс выше у того у кого работает, а не у того кто круче заплатки клепает.


"Заплатки клепать" приходится в любом случае. И чем проще "клепать заплатки", тем лучше. Причем "клепать заплатки" не всегда приходится тому же, кто "хорошую прогу" писал.

Так что: обсудим, у кого же "класс выше"? Т.е. методы определения "высоты класса".

P>ЗЫж Жаль сдесь твита нет...


Мне тоже жаль. А кто это?
Голь на выдумку хитра, однако...
Re[6]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.02 11:29
Оценка:
Здравствуйте VladD2, Вы писали:

Приношу свои извинения. Забыл поставить [code].

Привожу код еще раз.

for(;;)
{
  for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; 
             pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
}



Такое решение позволяет читающему код легко понять принцип работы программы...

P>IMHO, ежели у кого-то возникают проблемы с чтением этого кода, енто личные проблемы этого кого-то.


Именно проблемы. Но не личные. Личные проблемы начинаются у программиста который пишит такой код... ну, когда он хочет устроиться на работу в контору где ему придется работать в команде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Выйти из двух циклов сразу
От: Syber  
Дата: 31.05.02 22:46
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?



Вообщем так! Я толком не понял куда тебе нужно выйти, попробуй break;
или return 0; при втором он выйдет вообще, но если хорошо обработать очень даже ничего получается!
Re: Выйти из двух циклов сразу
От: Syber  
Дата: 31.05.02 22:52
Оценка:
Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!
Re[2]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 31.05.02 23:33
Оценка:
Здравствуйте Syber, Вы писали:

LG>>Как это сделать?


S>Вообщем так! Я толком не понял куда тебе нужно выйти, попробуй break;


Мда... почитал бы тогда всю ветку тогда, что ли

S>или return 0; при втором он выйдет вообще, но если хорошо обработать очень даже ничего получается!


А почему не return 1?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Выйти из двух циклов сразу
От: Dwarf Россия dwarf.h1.ru
Дата: 01.06.02 10:11
Оценка:
Здравствуйте George_Seryakov, Вы писали:

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


GS>Еще вариант:


GS>
GS>void a_function(..) {
LG>>while(1)
LG>>{
LG>>  for(int i = 0; i < 100; i++)
LG>>  {
LG>>    if(i == 77)
LG>>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
GS>         return;
LG>>  }
LG>>}
GS>}
GS>


Имхо, это самый удобный и надежный способ
Народу не нужны нездоровые сенсации. Народу нужны здоровые сенсации! (с) Стругацкие.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 02.06.02 08:53
Оценка:
Здравствуйте WolfHound, Вы писали:

[skip]


WH>

WH>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

Зато "Такое решение позволяет читающему код легко понять принцип работы программы... "
Почетный кавалер ордена Совка.
Re[4]: Выйти из двух циклов сразу
От: Dwarf Россия dwarf.h1.ru
Дата: 02.06.02 12:26
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>ИМХО, с таким стилем кода сложно писать большие приложения.


Windows например
Народу не нужны нездоровые сенсации. Народу нужны здоровые сенсации! (с) Стругацкие.
Re[8]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 08:53
Оценка:
Здравствуйте WolfHound, Вы писали:

WH>

WH>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

Вообще-то моя задача была дать общую идею. Ну, да ладно, перепишим эквивалентно:


for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3;)
{
  for(;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
}



WH>Можно так: ...

WH>Но это лишние извраты!

Да в твоем случае дейсвтительно лишние извраты.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Выйти из двух циклов сразу
От: Alex_st Россия  
Дата: 03.06.02 13:39
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


ну например так:
засовываеш циклы в отдельную ф-ю и отлично выходиш
void f()
{
  while(1)
  {
    for(int i = 0; i < 100; i++)
    {
      if(i == 77)
      return;
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
    }
  }
}
Re[9]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 03.06.02 18:37
Оценка:
Здравствуйте VladD2, Вы писали:

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


WH>>

WH>>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

VD>Вообще-то моя задача была дать общую идею. Ну, да ладно, перепишим эквивалентно:



do
{
  for((SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
}
while(pRecord3 != NULL);



WH>>Можно так: ...

WH>>Но это лишние извраты!

VD>Да в твоем случае дейсвтительно лишние извраты.


Можно и так, но как писать это ЛИЧНОЕ дело программиста и пытаться изменить стиль того чьи программы РАБОТАЮТ это ВРЕДНАЯ трата времени.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 19:16
Оценка:
Здравствуйте IT, Вы писали:

IT>Ошибаешься. Стиль может быть личным делом только одиночек и отщипенцев. В команде ты должен придерживаться стиля команды. И даже, если ты сам хорошо ориентируешся в безусловных переходах и пока ещё на наступал с ними на большие грабли, то это совсем не значит, что меняя твой код по каким либо причинам, кто-то другой не внесёт туда глюк по причине твоего столь "оригинального и ни на что не похожего" стиля.


Слушай! А как может называться стиль главным достоинством которго является использование goto? И как вообще использование goto можно назвать стилем?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 19:35
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Скажу честно, что если бы мой программист после проведения с ним ликбеза о вредности goto или необходимости выдергивания общего стиля продолжил бы разговоры о независимости, то он получил бы эту независимость без промедления...


Отсюда естественный способ защиты — успеть наглюкать как можно больше write-only кода пока начальник не затеял испраление стилей. Иногда срабатывает.

VD>Работодатели не соображающие в принципах построения надежного и легко поддерживаемого кода быстро разоряются.


Там еще есть баланс между умением впыживать и умением производить...

VD>Возвращаясь к исходному вопросу, могу сказать, что все пример приводимые в защиту goto надуманные.


Ну, тот пример с реализацией машины состояний вполне ничего как демонстрация принципа (сам писал так в 88-м? на Клиппере). В больших масштабах там будут вилы из-за эффектов пересечения по общим переменным.

VD>Они появились из-за неумения использовать структурных- и ОО-принципов программирования.


Ну, в общем, да. Я бы развернул это все как совокупность слоя решений — логики, состоящего из ифов и вызовов функций, и слоя действий — тел функций.

VD>Я практически на 100% уверен, что первые двадцать участников топа этого сайта не одобрили бы использование goto,


Да можно и с goto, ведь и с goto можно программить структурно, например, выражая с goto какую-нибудь семантику, отсутствующую в языке, типа finally.

Ну и потом при программировании машины состояний goto естественно воспроизводит переходы между состояниями. Кто бы нам про автоматное программирование рассказал. Вот, к примеру, есть у нас STD. Ну и как из него код отгенерить? Или там протокол — несколько взаимодействующих машин состояний, тоже — как?
GS
Re[4]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 03.06.02 19:40
Оценка:
Здравствуйте LeonGorbachev, Вы писали:

WH>>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.

LG>Самым умным я себя не считаю, но глядя на твой паршивый (извините за такое выражение) код, я вылез после душа
LG>и не смог удержаться и не переписать его.
LG>В общем-то вот такой код я считаю более читабельным и более правильным...

LG>
LG>[skip]
LG>

И чем же он лучше кроме того что тормозней?
LG>А по поводу работодателя, который смотрит в код —
LG>чесно говоря, я бы такого работника достаточно быстро уволил бы... хотя это мое ИМХО

И в обще для оценки качества кода есть 3 простых критерия:
1)Наличие ошибок
у вас покрайней мере одна
2)Скорость работы
эксепшены и вызовы процедур ее не увеличивают
3)Затраты памяти
у вас хоть не на много но больше
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 20:08
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Отсюда естественный способ защиты — успеть наглюкать как можно больше write-only кода пока начальник не затеял испраление стилей. Иногда срабатывает.


:)))

GS>Там еще есть баланс между умением впыживать и умением производить...


Это да... иначе 1С давно бы разорилась. Вот только одной 1С хватает.

GS>Ну, тот пример с реализацией машины состояний вполне ничего как демонстрация принципа (сам писал так в 88-м? на Клиппере). В больших масштабах там будут вилы из-за эффектов пересечения по общим переменным.


В смысле конечных автоматов? Дык они прекрасно деяться на функции, а состояния переключаются на свичах. Более того есть вообще альтернативные решения http://www.rsdn.ru/article/?alg/checkStr.xml
Автор(ы): Николай Меркин
Дата: 19.01.2002


VD>>Они появились из-за неумения использовать структурных- и ОО-принципов программирования.


GS>Ну, в общем, да. Я бы развернул это все как совокупность слоя решений — логики, состоящего из ифов и вызовов функций, и слоя действий — тел функций.


Говоря по-русски записал бы все в структурированном виде. :)

VD>>Я практически на 100% уверен, что первые двадцать участников топа этого сайта не одобрили бы использование goto,


GS>Да можно и с goto, ведь и с goto можно программить структурно, например, выражая с goto какую-нибудь семантику, отсутствующую в языке, типа finally.


Я уже говорил про обработку ошибок и очистку ресурсов, но для этих целей лучше подходят смарт-поинтеры и хелперы. Нашим программистам в приказном порядке запрещено выделять ресурсы без хелперов. Иначе размножат ошибку на 30 файлов...

GS>Ну и потом при программировании машины состояний goto естественно воспроизводит переходы между состояниями. Кто бы нам про автоматное программирование рассказал. Вот, к примеру, есть у нас STD. Ну и как из него код отгенерить?


Так все от рук и терпения зависит. Да и генерированный код тут не причем. Речь идет о коде рукописном. Любая программа на С++ превращается в неструктурированный набор ассемблерных команд с хаотическими переходами. Их тоже читать можно. У нас тут даже спецы по этому делу имеются (пользуясь случаем хочу предать привет ;) ), но код создается не компилятора, а для программиста. Это компилятор должен брать его и превращать в более менее оптимальный набор инструкций.

GS> Или там протокол — несколько взаимодействующих машин состояний, тоже — как?


Ты вроде сам на свои вопросы ответил. Функции перехода состояний организуют логику переходов, а другие функции — логику. Windows по существу — тоже является одним большим конечным автоматом, и каждое окошко в нем тоже, и взаимодействуют они друг с другом и ОС-ью не плохо. И тем не менее к концу двадцатого века goto (да и switch-и) уступили место папам (реализуемым на массивах или ифах) и ОО подходу. А ведь на goto там тоже все можно влет реализовать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 20:12
Оценка:
Здравствуйте IT, Вы писали:

IT>Когда-то очень давно я видел в каких-то исходниках что-то типа такого goto (за точность не ручаюсь):


IT>
IT>goto ForgiveMeGuysICannotBelieveIDidIt;
IT>...
IT>ForgiveMeGuysICannotBelieveIDidIt:
IT>...
IT>


IT>:))


Да предстваляю как товарищь сокрушался... :)))
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 03.06.02 20:27
Оценка:
Здравствуйте George_Seryakov, Вы писали:

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


VD>>Скажу честно, что если бы мой программист после проведения с ним ликбеза о вредности goto или необходимости выдергивания общего стиля продолжил бы разговоры о независимости, то он получил бы эту независимость без промедления...


GS>Отсюда естественный способ защиты — успеть наглюкать как можно больше write-only кода пока начальник не затеял испраление стилей. Иногда срабатывает.

Глюкать не буду религия не позволяет. К тому же работодателю будет не реально вменить мне в вину goto (хотя он может уволить без обьяснения причин) при двух ксловиях:
1)Отсутствие глюков(давно не доживают до бета-версии)
2)Мнгновенное внесение нужных изменений.

VD>>Работодатели не соображающие в принципах построения надежного и легко поддерживаемого кода быстро разоряются. :)


GS>Там еще есть баланс между умением впыживать и умением производить...


VD>>Возвращаясь к исходному вопросу, могу сказать, что все пример приводимые в защиту goto надуманные.


GS>Ну, тот пример с реализацией машины состояний вполне ничего как демонстрация принципа (сам писал так в 88-м? на Клиппере). В больших масштабах там будут вилы из-за эффектов пересечения по общим переменным.


VD>>Они появились из-за неумения использовать структурных- и ОО-принципов программирования.

Если вы думаете что я использую goto потому что не умею использовать структуры или ОО то вы ошибаетесь.
GS>Ну, в общем, да. Я бы развернул это все как совокупность слоя решений — логики, состоящего из ифов и вызовов функций, и слоя действий — тел функций.

Я пишу class для интерфейса, а методы пишу на автоматах. Ибо сила в гибридах.

VD>>Я практически на 100% уверен, что первые двадцать участников топа этого сайта не одобрили бы использование goto,


GS>Да можно и с goto, ведь и с goto можно программить структурно, например, выражая с goto какую-нибудь семантику, отсутствующую в языке, типа finally.


GS>Ну и потом при программировании машины состояний goto естественно воспроизводит переходы между состояниями. Кто бы нам про автоматное программирование рассказал. Вот, к примеру, есть у нас STD. Ну и как из него код отгенерить? Или там протокол — несколько взаимодействующих машин состояний, тоже — как?

:) ну хоть один единомышленник нашолся. А про автоматы можно почитать здесь.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 20:32
Оценка:
Здравствуйте VladD2, Вы писали:

VD>В смысле конечных автоматов? Дык они прекрасно деяться на функции, а состояния переключаются на свичах. Более того есть вообще альтернативные решения http://www.rsdn.ru/article/?alg/checkStr.xml
Автор(ы): Николай Меркин
Дата: 19.01.2002


Уговорил. Именно этой ссылки я добиваюсь уже месяц. Почему ты мне не дал ее раньше?

GS>>Ну, в общем, да. Я бы развернул это все как совокупность слоя решений — логики, состоящего из ифов и вызовов функций, и слоя действий — тел функций.


VD>Говоря по-русски записал бы все в структурированном виде.


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

GS>>Ну и потом при программировании машины состояний goto естественно воспроизводит переходы между состояниями. Кто бы нам про автоматное программирование рассказал. Вот, к примеру, есть у нас STD. Ну и как из него код отгенерить?


VD>Так все от рук и терпения зависит.


Неет. Я так несогласный.

VD>Да и генерированный код тут не причем. Речь идет о коде рукописном.


И я о рукописном, но писаном по определнным правилам, гарантируюшим несовершение хоть какой-то части ошибок.

GS>> Или там протокол — несколько взаимодействующих машин состояний, тоже — как?


VD>Ты вроде сам на свои вопросы ответил. Функции перехода состояний организуют логику переходов, а другие функции — логику.


Нее... А вот что-то вроде Меркинской статьи, но про протоколы — есть?
GS
Re[13]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 20:41
Оценка:
Здравствуйте WolfHound, Вы писали:

VD>>>Они появились из-за неумения использовать структурных- и ОО-принципов программирования.


WH>Если вы думаете что я использую goto потому что не умею использовать структуры или ОО то вы ошибаетесь.


Тяжелое детство?

GS>>Ну, в общем, да. Я бы развернул это все как совокупность слоя решений — логики, состоящего из ифов и вызовов функций, и слоя действий — тел функций.


WH>Я пишу class для интерфейса, а методы пишу на автоматах. Ибо сила в гибридах.


Ни фига. Сила — в быстром обороте средств. Программер(ы) должны максимально быстро достигнуть уровня минимальной продаваемости продукта, после чего средства считаются обернутыми.

GS>>Ну и потом при программировании машины состояний goto естественно воспроизводит переходы между состояниями. Кто бы нам про автоматное программирование рассказал. Вот, к примеру, есть у нас STD. Ну и как из него код отгенерить? Или там протокол — несколько взаимодействующих машин состояний, тоже — как?


WH> ну хоть один единомышленник нашолся. А про автоматы можно почитать здесь.


Ну, читал я там. Какой-то он упертый на своем собственном открытии Америки, что и к остальному доверие несколько подрывает.
GS
Re[14]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 20:53
Оценка:
Здравствуйте George_Seryakov, Вы писали:

VD>>В смысле конечных автоматов? Дык они прекрасно деяться на функции, а состояния переключаются на свичах. Более того есть вообще альтернативные решения http://www.rsdn.ru/article/?alg/checkStr.xml
Автор(ы): Николай Меркин
Дата: 19.01.2002


GS>Уговорил. Именно этой ссылки я добиваюсь уже месяц. Почему ты мне не дал ее раньше?


Будешь смеяться но она в новостях уже месяц болтается. У тебя какя страничка по умолчанию на рсдн-е? Или ты сражу на http://www.rsdn.ru/forum лезешь?

Надо будет кинуть идею о рассылке уведомлений о новостях на сайте...

GS>Ну, наверное, не совсем. Будучи структурным, можно все-таки размешать логику в остальном коде, что плохо.


Думаю, что плохо это когда логика храмает и способы ее реализации не читабельны... А так...

GS>И я о рукописном, но писаном по определнным правилам, гарантируюшим несовершение хоть какой-то части ошибок.


Тогда причем тут "генерация года". Ты что генератор? Я лично отказ от goto как раз отношу к одному из правил "гарантируюших несовершение хоть какой-то части ошибок". Хотя я бы это перефразировал так: позволяющих свести количество ошибок и время на их выявления к минимуму.

VD>>Ты вроде сам на свои вопросы ответил. Функции перехода состояний организуют логику переходов, а другие функции — логику.


GS>Нее...


А тогда это, что означате?

GS>Ну, в общем, да. Я бы развернул это все как совокупность слоя решений — логики, состоящего из ифов и вызовов функций, и слоя действий — тел функций.


GS>А вот что-то вроде Меркинской статьи, но про протоколы — есть?


Четр его занет. Посмотри спсок статеф... может чё и найдешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 21:09
Оценка:
Здравствуйте VladD2, Вы писали:

GS>>Уговорил. Именно этой ссылки я добиваюсь уже месяц. Почему ты мне не дал ее раньше?


VD>Будешь смеяться но она в новостях уже месяц болтается. У тебя какя страничка по умолчанию на рсдн-е?


Да у нее название — про строки чего-то. Откуда я знал — что она про автоматы?

VD>Или ты сражу на http://www.rsdn.ru/forum лезешь?


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

GS>>И я о рукописном, но писаном по определнным правилам, гарантируюшим несовершение хоть какой-то части ошибок.


VD>Тогда причем тут "генерация года". Ты что генератор?


Конечно. Ты что — только розой код генеришь? А что до розы люди преспокойно вручную код генерировали из чего-то, не являющегося кодом — это открытие?

Я, в конце концов, не обязан все время код головным мозгом писать.

VD>Я лично отказ от goto как раз отношу к одному из правил "гарантируюших несовершение хоть какой-то части ошибок".


Одно из правил одной из системы правил. А могут быть и другие системы генерации, не исключающие goto, но контролирующие его использование вполне приемлемым образом.

VD>>>Ты вроде сам на свои вопросы ответил. Функции перехода состояний организуют логику переходов, а другие функции — логику.


Нет. Как развернуть логику переходов в код по жестким правилам гарантирующим вопроизведение данной машины состояний. Как по STD код сгенерить.

GS>>А вот что-то вроде Меркинской статьи, но про протоколы — есть?


VD>Четр его занет. Посмотри спсок статеф... может чё и найдешь.


По слову "автомат" — статья НМ, по слову "протокол" — что-то не видно...
GS
Re[16]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 21:55
Оценка:
Здравствуйте George_Seryakov, Вы писали:

VD>>Будешь смеяться но она в новостях уже месяц болтается. У тебя какя страничка по умолчанию на рсдн-е?


GS>Да у нее название — про строки чего-то. Откуда я знал — что она про автоматы?


Нда. Название маскировочное.

VD>>Или ты сражу на http://www.rsdn.ru/forum лезешь?


GS>Ну. Правда, чтоб поиск запустить, на корневую хожу. Недоработка, однако, нужно дать поиск с любого места. А то что-то вопросов много задают...




VD>>Тогда причем тут "генерация года". Ты что генератор?


GS>Конечно. Ты что — только розой код генеришь? А что до розы люди преспокойно вручную код генерировали из чего-то, не являющегося кодом — это открытие?


Я код генерю только ERWin-ом или Visio 2002. Роза инструмент не доделаный. Я туда как-то наш проект загрузил, она показала мне классик (вернее 1/10 от него, так как весь он в страничку не влезал ) и сдохла. Ее теоретики писали. Интересно они свою розу на ней же проектировали или этот мазахизм они упустили?

Ну, а руками... я привык называть это писанием... ну, или кодированием.

GS>Я, в конце концов, не обязан все время код головным мозгом писать.




GS>Одно из правил одной из системы правил. А могут быть и другие системы генерации, не исключающие goto, но контролирующие его использование вполне приемлемым образом.


Ага. В них только нужно еще if-ы заменить на test и добавить ключевые слова near и far/

GS>Нет. Как развернуть логику переходов в код по жестким правилам гарантирующим вопроизведение данной машины состояний. Как по STD код сгенерить.


А между прочем все это можно представить в событийной модели. Тогда и ОО-принципы нормально впишутся, и структурированность, проблемы с переходами состояний развеются (называться будут по дргугому).

GS>По слову "автомат" — статья НМ, по слову "протокол" — что-то не видно...


Ну, задай этот вопрос в отдельной ветке. Может кто подскажит...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 22:07
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Я код генерю только ERWin-ом или Visio 2002. Роза инструмент не доделаный.


Пользоваться надо уметь. Я ею ATL-ный проект в модель поднимал, и потом обратно в компилируемый код генерировал.

GS>>Нет. Как развернуть логику переходов в код по жестким правилам гарантирующим вопроизведение данной машины состояний. Как по STD код сгенерить.


VD>А между прочем все это можно представить в событийной модели. Тогда и ОО-принципы нормально впишутся, и структурированность, проблемы с переходами состояний развеются (называться будут по дргугому).


Можно, говоришь? Ну расскажи,как. Чтоб спинным мозгом программировалось.
GS
Re[18]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 22:24
Оценка:
Здравствуйте George_Seryakov, Вы писали:

VD>>Я код генерю только ERWin-ом или Visio 2002. Роза инструмент не доделаный.


GS>Пользоваться надо уметь. Я ею ATL-ный проект в модель поднимал, и потом обратно в компилируемый код генерировал.


От моего ATL-ого проекта она падает. И вообще я не против амтомтизации проеткирования. Но пусть эти средства тоже будут проффесионально спроектированными. А обуваться у сапожника без сопог.

Да и небыло у нас проблем с проектированием. Всегда планов было больше чем можем сделать.

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

Так вот я с системами проектирования уже 10 лет работаю. Сам планы кое чего подобного вынашиваю, и когда я сталкиваюсь с продуктом от которым я не могу получить полозительного результата в течении недели, я его просто выбрасываю. Потом меня например совершенно не устраивает, что реальное моделирование идет только на уровне ОО-модели, а все остальные модели ни как с ней не связаны (физически). Этак я и на бумажке могу или в Визио. Помени мое слово Визио черз пару-иройку лет заткнет за пазушу эту Розу.

VD>>А между прочем все это можно представить в событийной модели. Тогда и ОО-принципы нормально впишутся, и структурированность, проблемы с переходами состояний развеются (называться будут по дргугому).


GS>Можно, говоришь? Ну расскажи,как.


Да очень просто... Состояния — отрибуты объектов. Переходы — логика обработки событий. Действия — методы. Я тебе уже на Виндовс и ее окошки показывл. Чем не конечный автомат реализуемый по ОО-модели?

GS>Чтоб спинным мозгом программировалось.


Ну, я лично предпочитаю обычным думать. Но как показывает практика (тренировок в Кваке и разных Крфтах) долгие и упорные тренировки позволяют исключить мыслительный процесс из принятия повседневных решений.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 22:29
Оценка:
Здравствуйте IT, Вы писали:

S>>или return 0; при втором он выйдет вообще, но если хорошо обработать очень даже ничего получается!


IT>А почему не return 1?


Предлагаю прог компромис: return 0.5;

Или суровое но верное решение: return -1;
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 22:37
Оценка:
Здравствуйте WolfHound, Вы писали:

DG>>И почему очень не нравится предыдущий код, особенно, если бы его писал мой подчиненный...

WH>И почему-бы я не стал работать на босса которого интересует как выглядит мой код, а не то как он работает.

Извени... немогу удержаться... Наверное потому, что от тебя... Молчу, молчу... ухожу, ухожу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 22:37
Оценка:
Здравствуйте VladD2, Вы писали:

GS>>Пользоваться надо уметь. Я ею ATL-ный проект в модель поднимал, и потом обратно в компилируемый код генерировал.


VD>От моего ATL-ого проекта она падает.


Да, в той розе (98-го года) было место, гже нужно было бинарик подпатчить. После этого можно было неподпатченным дальше анализировать.

VD>И вообще я не против амтомтизации проеткирования. Но пусть эти средства тоже будут проффесионально спроектированными. А обуваться у сапожника без сопог.


Идеалист. А вот они в розе реалисты. Продается и хорошо.

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


Ну. Говоришь "фэ" и идешь к конкуренту. Продолжать?

VD>... Потом меня например совершенно не устраивает, что реальное моделирование идет только на уровне ОО-модели, а все остальные модели ни как с ней не связаны (физически).


Там еще на уровне физ. дизайна — раскладки классов по файлам есть.

VD>Этак я и на бумажке могу или в Визио.


Ну. Это и есть кодогенерация вручную.

VD>Помени мое слово Визио черз пару-иройку лет заткнет за пазушу эту Розу.


А что — она умеет код генерить? Не знал. Вообще-то у Рашионал и MS есть что-то вроде соглашения о неконкуренции. Было, по крайней мере.

GS>>Чтоб спинным мозгом программировалось.


VD>Ну, я лично предпочитаю обычным думать.


Не наш метод.
GS
Re[4]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 22:40
Оценка:
Здравствуйте flyker, Вы писали:

F>Мдя... Неужели ТАК еще кто то пишет...


Зато никакого скрытого кода! Пусть даже он компилятором весь и выбрасывается...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 23:18
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Идеалист. А вот они в розе реалисты. Продается и хорошо.


Мне до их прдах дела нет. Думаю визио продается куда лучше, что же теперь мне продукты по рейтингу продаж выбирать? Тогда нужно проектировать на редакторе от Варкрафта.

GS>Ну. Говоришь "фэ" и идешь к конкуренту. Продолжать?


У них пока не лучше. Так что фэ я уже сказал... будем ждать конкурента.

VD>>... Потом меня например совершенно не устраивает, что реальное моделирование идет только на уровне ОО-модели, а все остальные модели ни как с ней не связаны (физически).


GS>Там еще на уровне физ. дизайна — раскладки классов по файлам есть.


Там ного чего есть. Там например есть нечто очень похожее на дизайнер тех самые конечных автоматов (забыл как называется). Вот только он до конечного результата не доходит, впрочем как и многие другие схемы. Я имел в виду это, а не выход на физический уравень.

VD>>Этак я и на бумажке могу или в Визио.


GS>Ну. Это и есть кодогенерация вручную.


Это называется использование более удобного средства. Когда на розе (или конкурирующем продукте типа Визио) можно будет так же удобно и продуктивно работать, то я с удовольствием перелезу, а пока у меня на проектирование уходит 1% всего времени, а на возьню с этими недовернутыми концепт-карами море времени без видимой отдачи, я буду проектировать вручную.

VD>>Помени мое слово Визио черз пару-иройку лет заткнет за пазушу эту Розу.


GS>А что — она умеет код генерить? Не знал.


Умеет. Пока хреновенько, но потенциал большой. От того же ERWin-а мы похоже отказались в пользу Визио (хоть и уступает она кое в чем, но приимуществ больше, главное мньше глюков и удобнее).

GS>Вообще-то у Рашионал и MS есть что-то вроде соглашения о неконкуренции. Было, по крайней мере. Я думаю они Рашионалу акций на пару сотен мегобаксов отстегнули и Рашионал будет делать вид, что их вытесняет злой монстр-монополист.


GS>>>Чтоб спинным мозгом программировалось.


VD>>Ну, я лично предпочитаю обычным думать.


GS>Не наш метод.


Немогу не слгласится!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 03.06.02 23:36
Оценка:
Здравствуйте VladD2, Вы писали:

GS>>Идеалист. А вот они в розе реалисты. Продается и хорошо.


VD>Мне до их прдах дела нет. Думаю визио продается куда лучше, что же теперь мне продукты по рейтингу продаж выбирать?


Да. Поглядывать. Соберут они денег на сделать следующую версию или нет. Вот Микрософь собрал денег на сделать NT, а IBM слил воду.

VD>Тогда нужно проектировать на редакторе от Варкрафта.


Продукт будет развиваться в расчете на текущих пользователей, а они — игруны, не проектировщики.

VD>Там ного чего есть. Там например есть нечто очень похожее на дизайнер тех самые конечных автоматов (забыл как называется).


Диаграмма взаимодействий. Которая на самом деле SDT и диаграмма Хоара одновременно.

VD>Вот только он до конечного результата не доходит, впрочем как и многие другие схемы. Я имел в виду это, а не выход на физический уравень.


Ну. Так главное — проектировать, а генерировать можно и врукопашную.

VD>Это называется использование более удобного средства. Когда на розе (или конкурирующем продукте типа Визио) можно будет так же удобно и продуктивно работать, то я с удовольствием перелезу, а пока у меня на проектирование уходит 1% всего времени,


А вот сейчас тебе и скажут, что ты, значит, и не проектируешь.
GS
Re[6]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 04.06.02 04:37
Оценка:
Здравствуйте IT, Вы писали:

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


WH>>И в обще для оценки качества кода есть 3 простых критерия:


IT>Главная оценка качества кода — maintenance, т.е. сопровождаемость и первое правило, которого нужно придерживаться — это то, что твой код будут читать и возможно править другие программисты. При этом некоторые из них менее опытные и будут тебя материть за непонятность и запутанность кода, а некоторые более опытные будут материть тебя за то же самое, но уже по другому.


Т.е. производство ради производства?

IT>Иногда встречаются такие программы, которые можно назвать монолитными. Не потому что они стройные и красивые, а потому что они неизменяемые и повторно неиспользуемые. Для того чтобы в них добавить хоть одну фичу их можно только полностью переписть, при этом перечисленным тобой ниже оценкам они вполне удовлетворяют, но ценность у них никакая для будущих поколений. Все твои goto как раз и делают программу монолитной и неизменяемой. Тому кто будет идти за тобой придётся твой код переделывать полностью. Понятное дело, что писать такие программы много ума не надо, а вот попробуй написать так, чтобы тот кто открыл твой текст сразу бы уведел место куда можно добавить свой кусочек и не тратил бы часы на выискивание меток и их вызовов.


А тебе не приходило в голову, что частенько пишутся программы, которые и должны быть монолитными? Которые и не нужно изменять? Ты всегда "офисный" софт пишешь? Тогда, конечно, узеру всегда приятно видеть пару лишних фенечек. А как насчет, что софт иногда пишется под конкртное железо (или ето уже не модно)?

А maintenance, как ты выразился, в большинстве софтверных контор вырождается в убирание багов уже после релиза.

WH>>1)Наличие ошибок

WH>>у вас покрайней мере одна
WH>>2)Скорость работы
WH>>эксепшены и вызовы процедур ее не увеличивают
WH>>3)Затраты памяти
WH>>у вас хоть не на много но больше

IT>Это всё важно, но вторично.


Еще раз повторюсь, есть вещи в которых _ЭТО_ первично. А вот модное слово maintenance вторично, либо совсем не нужно.
Почетный кавалер ордена Совка.
Re[5]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 04.06.02 04:46
Оценка:
Здравствуйте WolfHound, Вы писали:

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




WH>И в обще для оценки качества кода есть 3 простых критерия:

WH>1)Наличие ошибок
WH>у вас покрайней мере одна
WH>2)Скорость работы
WH>эксепшены и вызовы процедур ее не увеличивают
WH>3)Затраты памяти
WH>у вас хоть не на много но больше

но и писалось это перед сном (после душа ) быстро и только потому, что пример Вашего кода
с использованием "гото" порсто вывел меня из себя
Re[7]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 04.06.02 04:58
Оценка:
Здравствуйте Patalog, Вы писали:


P>А тебе не приходило в голову, что частенько пишутся программы, которые и должны быть монолитными? Которые и не нужно изменять? Ты всегда "офисный" софт пишешь? Тогда, конечно, узеру всегда приятно видеть пару лишних фенечек. А как насчет, что софт иногда пишется под конкртное железо (или ето уже не модно)?


Не ради стёба спрашиваю, а ради интереса — на самом деле, какие такие программы, "которые и должны быть монолитными, Которые и не нужно изменять" ?
Re[9]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 04.06.02 05:00
Оценка:
Здравствуйте VladD2, Вы писали:

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


WH>>

WH>>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

VD>Вообще-то моя задача была дать общую идею. Ну, да ладно, перепишим эквивалентно:



VD>
VD>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3;)
VD>{
VD>  for(;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
VD>  {
VD>    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
VD>    {
VD>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
VD>                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
VD>       if(nRes != CCB_ERR_NOERROR)
VD>       {
VD>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
VD>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
VD>            //Передается юзеру, который должен как-то отреагировать на ошибку
VD>            nCallBackRes = pCheckControl->DoControl(nRes); 
VD>            nErrorCount++;
VD>            
VD>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
VD>               continue; //OK, продолжаем дальше
VD>            else if(nCallBackRes == CCB_RES_ABORT) 
VD>               return nErrorCount; //Failed, отмена
VD>            else 
VD>               //Юзер попытался исправить ошибку, надо проверить заново
VD>               break;
VD>       }
VD>   }
VD>}
VD>



Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
Тк в оригинале при "Юзер попытался исправить ошибку" цикл начнется заново, а в вашем случяе продолжиться.

WH>>Можно так: ...

WH>>Но это лишние извраты!

Можно и так, но так работать не будет.
Почетный кавалер ордена Совка.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 04.06.02 05:15
Оценка:
Здравствуйте LeonGorbachev, Вы писали:

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



P>>А тебе не приходило в голову, что частенько пишутся программы, которые и должны быть монолитными? Которые и не нужно изменять? Ты всегда "офисный" софт пишешь? Тогда, конечно, узеру всегда приятно видеть пару лишних фенечек. А как насчет, что софт иногда пишется под конкртное железо (или ето уже не модно)?


LG>Не ради стёба спрашиваю, а ради интереса — на самом деле, какие такие программы, "которые и должны быть монолитными, Которые и не нужно изменять" ?


Ну, представь себе такую ситуацию.
Есть некий прибор, управляется ета хрень какой-нибудь двушкой в железном ящичке под голым досом. Энтих приборчиков энное количество по всему миру (например в Нижнезадрюпенской области, городе Мухосраннске).
Maintenance с точки зрения новых красивых фенечек ненужен\невозможен по двум причинам — как ты представляешь обновление софта в этой ситуации? И, второе, железо (приборчик) рабоает на пределе, и новых фенечек из него не высосешь. Да и не нужны они, себестоимость тоже нужно учитывать.
Почетный кавалер ордена Совка.
Re[9]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 04.06.02 05:43
Оценка:
Здравствуйте Patalog, Вы писали:

P>Ну, представь себе такую ситуацию.

P>Есть некий прибор, управляется ета хрень какой-нибудь двушкой в железном ящичке под голым досом. Энтих приборчиков энное количество по всему миру (например в Нижнезадрюпенской области, городе Мухосраннске).
P>Maintenance с точки зрения новых красивых фенечек ненужен\невозможен по двум причинам — как ты представляешь обновление софта в этой ситуации? И, второе, железо (приборчик) рабоает на пределе, и новых фенечек из него не высосешь. Да и не нужны они, себестоимость тоже нужно учитывать.

В этой ситуации возможно ты и прав... я не могу объективно судить
Но, например, WolfHound привел пример программы на WinAPI, и следовательно он врят-ли
пишет для хрени с девушкой в железном ящичке...
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 04.06.02 07:32
Оценка:
Здравствуйте LeonGorbachev, Вы писали:

[skip]

LG>В этой ситуации возможно ты и прав... я не могу объективно судить

LG>Но, например, WolfHound привел пример программы на WinAPI, и следовательно он врят-ли
LG>пишет для хрени с девушкой в железном ящичке...

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

ЗЫж А "девушкой в железном ящичке..." — рулез
Мсье оригинал
Почетный кавалер ордена Совка.
Re: Выйти из двух циклов сразу
От: Хитрик Денис Россия RSDN
Дата: 04.06.02 07:38
Оценка:
Ребята, давайте завершать беседы об отвлечённых материях. По теме в последнее время достаточно мало было сказано
Если кто не успел высказаться, вперёд! Заводите новую тему и публикуйте в соответствующем форуме.

P.S. Хорошо, что темы пока нельзя закрывать А то закрыл бы и не случилось бы такого бурного обсуждения в почти чистом форуме С++
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[11]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.06.02 07:39
Оценка:
Здравствуйте Patalog, Вы писали:

P>Ето я к тому, что многим почему-то свойственно говорить за всех и за все.

P>Не все проблемы вписываются в красивые абзацы умных книжек умных дяденек.

Зато они говорят о том, к чему надо стремится.

Даже если взять пример про "девушку в железном ящичке". Он же тоже пишется не сразу весь, а есть бета-версии, правятся баги, при крупных ошибках, могут переписываться довольно большие участки кода и т.д., используются какие-то готовые участки кода, поэтому даже в этом случае сложно говорить о какой-то монолитности(неизменности).
Re[12]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 04.06.02 07:55
Оценка:
Здравствуйте DarkGray, Вы писали:

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


P>>Ето я к тому, что многим почему-то свойственно говорить за всех и за все.

P>>Не все проблемы вписываются в красивые абзацы умных книжек умных дяденек.

DG>Зато они говорят о том, к чему надо стремится.


DG>Даже если взять пример про "девушку в железном ящичке". Он же тоже пишется не сразу весь, а есть бета-версии, правятся баги, при крупных ошибках, могут переписываться довольно большие участки кода и т.д., используются какие-то готовые участки кода, поэтому даже в этом случае сложно говорить о какой-то монолитности(неизменности).


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

ЗЫж Пора либо прекратить религиозные споры, либо перенести в прочее.
Почетный кавалер ордена Совка.
Re[11]: Выйти из двух циклов сразу
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 04.06.02 08:48
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Влад говорил, что первая двадцатка топа его поддержит. Ну, я уже давно из неё выбыл, так что мне можно.

Ща мы тебя в нее опять задвинем. Сколько тебе там надо? 65 очков?

Для чистоты эксперимента сам пока ставить не буду. Но оч. круто написал. Предлагаю поставить точку на этом.
Алексей Кирдин
Re[11]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 04.06.02 08:56
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

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


P>>

P>>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
P>>Тк в оригинале при "Юзер попытался исправить ошибку" цикл начнется заново, а в вашем случяе продолжиться.

AS> Самое интересное, что этот факт тоже можно истолковать двояко. goto сделало твой код настолько непонятным, что Влад со второго раза не может переписать его правильно. Вывод однозначен — goto несёт вред. Давить!


Как я понял, проблемы с пониманием возникли только у него, но это как я и говорил его личные проблемы.

Складывается впечатление, что все противники goto работают в коллективе не менее чем человек 200 (причем удаленно), разрабатывают просто грандиозные проЭкты, в основном заботясь о том, чтобы оставить себе хорошую возможность позднее править кучу багов, ибо времени на хорошее кодирование не остается, поскольку оно ушло на проекирование и реализацию "граммотного структурного кода". Упаси боже сомневаться в огромной его пользе, Это многое, но не все.
А то что "граммотный структурный код" может работать неправильно или не работать совсем, я думаю все понимают

Все тобой нижесказанное и мной поскипанное целиком поддреживаю, распечатаю и повешу на стенку. Ибо как говорится, "Никогда не говори никогда".

[skip]
Почетный кавалер ордена Совка.
Re[11]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 04.06.02 09:42
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Во-первых, мне не совсем понятно, почему для противники goto постоянно щеголяют приёмами из арсенала C++. Если goto противоречит принципам структурного программирования, давайте оперировать средствами языка C. То есть никаких исключений, объектных обёрток и пр.


Не, это не честно. Неиспользование goto в C — это уже совсем другой вопрос. Я думаю, экстремистов, утверждающих, что goto не нужен в С куда меньше, чем протестующих против его использования в C++.

AS>Кстати, в Java goto убрали, но расширили синтаксис break для выхода из вложенных циклов. Похоже, ребята рассуждали похожим образом.


И правильно сделали. А комитет по стандартизации C++ правильно делает, что goto не убирает. Хотя break усовершенствовать не помешало бы — глядишь, goto только в legacy коде и остался бы.

AS>В-третьих, по поводу других предложенных методов.

AS>1. Вспомогательная функция+выход по return. Поскольку функции по правилам C могут находиться в любом месте программы (в т. ч. в другом модуле), читателю совершенно непонятно, куда приведёт return. Эту ситуацию можно немного поправить, структурируя код и добавляя комментарии, но это не меняет сути — такой подход не способствует читабельности.

Вот именно! Функция должна выполнять логически завершенное действие, а не служить заменой циклу. Уж лучше goto.

AS>2. Вспомогательные переменные и проверки. Конечно, это субъективно, но на мой взгляд они более непонятны для читателя. И чем глубже вложенность, тем ситуация хуже. Логически выход осуществляется в том месте, где мы измегняем условие выхода, но фактически выход осуществляется где-то в другом месте (возможно, несколькими страницами выше/ниже). Читабельности это не способствует.


AS>Проблема в том, чтоь вложенные циклы со сложной логикой выхода — конструкция сама по себе не очень очевидная. Я согласен, что если программу можно перепроектировать и избавиться от них, то это нужно сделать. Но это возможно не всегда.


Угу. Но break в стиле java был бы красивше. В общем-то, есть большая между return/break и goto — goto умеет прыгать назад.

AS>В-четвёртых, по поводу квалификации программиста и зависимости количества goto от неё. Смеха ради я открыл папку VC6 и сделал по ней глобальный поиск. Что же я вижу? MFC. goto используются во многих местах. Ну, я всегда подозревал, что MFC писали ламеры. Смотрим дальше. CRT. Что это? И здесь goto? Список кандидатов на увольнение из Микрософт разрастается... Но ведь есть же ATL. Её писали настоящие ООП-пацаны, они не могут нас подвести. Как, и здесь goto? :???: Поистине, мы живём в обществе потребления, без веры, без идеалов... ;) Список можно продолжать. Загляните в исходники ядра Linux. Там вы тоже найдёте goto. Почему Linux-комьюнити до сих пор не переписала этот позорный код? Ы? Вот и я о том же.


Не, это не слишком удачные примеры. Linux вроде как на C писана, там goto нужнее. CRT — тоже. Что касается ATL, то в atlbase.h можно было легко обойтись без goto, не потеряв читабельности. atlcom.h — CSecurityDescriptor::GetTokenSids и CSecurityDescriptor::Attach, по-моему, написаны не слишком тщательно, там при некоторых ошибках лики вроде могут быть (да и код этот явно унаследованный). atldb.h — одно большое глюкало, явно писалось на скорую руку (когда пришлось однажды его использовать, нашел кучу разнообразных утечек). statreg.h — в CRegObject::RegisterFromResource (написанной в сишном стиле, кстати) от goto без труда можно было бы избавиться (вроде даже без объектных оберток); в CRegParser::RegisterSubkeys вообще хрен чего поймешь, что с goto, что без него — код явно write-only :), напрашивается на полное переписывание при необходимости малейшей модификации. Так что насчет "настоящих ООП-пацанов" я сильно не уверен :))

AS>Ну и последнее. По поводу надуманности примеров, где goto реально помогает. На мой взгляд, даже в Windows-программировании такие случаи бывают. Вот самый что ни есть типичный сценарий (напоминаю, пока мы остаёмся в рамках C):


AS>
AS>void foo()
AS>{
AS>   HANDLE hFile = NULL; // Файл
AS>   HANDLE hFileMapping = NULL; // Отображение
AS>   LPVOID pMappedBuffer = NULL; // Буфер для работы с отображением
AS>   char *pBuf = NULL; // Целевой буфер
AS>   BOOL bResult = TRUE;

AS>   // Открываем файл
AS>   // Создаём отображение
AS>   // Мапим
AS>   // Копируем содержимое файла в буфер
AS>   // Работаем с данными

AS>failure:
AS>   bResult = FALSE;

AS>cleanup:

AS>   if(pBuf != NULL)
AS>      delete [] pBuf;
AS>   if(pMappedBuffer != NULL)
AS>      UnmapViewOfFile(pMappedBuffer);
AS>   if(hMapping != NULL)
AS>      CloseHandle(hMapping);
AS>   if(hFile != NULL)
AS>      CloseHandle(hFile);

AS>   return bResult;
AS>}
AS>


AS>Да, в C++ это решается с помощью исключений. Но исключения — палка о двух концах. Во-первых, не все пишут на C++ (некоторые на C). Во-вторых, бывают разные платформы. Я сейчас пишу для Windows CE, так вот здесь исключения C++ вместе с RTTI не поддерживаются. Не поддерживаются, и всё тут. В-третьих, любители жить без CRT тоже не очень-то жалуют исключения (и ATL/WTL вполне поддерживают такой стиль жизни).


Не, исключения тут ни к чему — не для того их придумывали. Только объектные обертки — если подходящих классов нет, описываем прямо внутри foo(). Все шустро делается инлайновыми деструкторами, никакого проигрыша по сравнению с goto — одни плюсы. А без CRT — это уже не С++, а "С с классами", да и то урезанный.

AS>Можно приводить и другие примеры. Про встроенные/низкоуровневые системы, которые с основном пишутся на C, тут уже сказали, и я с этим согласен. Другой характерный пример — портирование. Когда портируешь, скажем, сложную вычислительную программу с Фортрана (а они испещрены goto), лучше всего не ломаться и перенести все goto без изменений (проверено практикой). Иначе вероятность внести ошибку огромна, а проверить возможности нет никакой (большинство goto — это какие-то вырожденные случаи алгоритма, и если он сложен, нужный набор исходных данных фиг подберёшь). Впрочем, последний пример — это и иллюстрация недостатков goto при их повсеместном применении (как это было в фортране).


Я вот только два примера оправданного использования goto в C++ знаю — выход из вложенных циклов и впихивание к себе в программу чужого/унаследованного кода. Больше ничего не попадалось.

AS>Резюме. Я призиваю участников этого флейма не быть такими категоричными. Эту ветку могут читать начинающие. Не надо прессовать им мозги "незыблемыми правилами". Лучше поучите их думать головой.


Это правильно.

AS>PS. "Правила игры", принятые в некоторой фирме (всяческие styleguide'ы и пр.), следует уважать. Большие программы создаются большими коллективами. Хотя умение работать в команде не имеет прямого отношения к квалификации программиста, это важнейшая вещь. Этому нужно учиться. Чего себе и вам желаю.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[12]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 04.06.02 10:23
Оценка:
Здравствуйте Sergey, Вы писали:

S>Здравствуйте Alexander Shargin, Вы писали:


AS>>Во-первых, мне не совсем понятно, почему для противники goto постоянно щеголяют приёмами из арсенала C++. Если goto противоречит принципам структурного программирования, давайте оперировать средствами языка C. То есть никаких исключений, объектных обёрток и пр.


S>Не, это не честно. Неиспользование goto в C — это уже совсем другой вопрос. Я думаю, экстремистов, утверждающих, что goto не нужен в С куда меньше, чем протестующих против его использования в C++.


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


S>Угу. Но break в стиле java был бы красивше. В общем-то, есть большая между return/break и goto — goto умеет прыгать назад.


Ох, а ведь есть ещё setjmp/longjmp...


AS>>В-четвёртых, по поводу квалификации программиста и зависимости количества goto от неё. Смеха ради я открыл папку VC6 и сделал по ней глобальный поиск. Что же я вижу? MFC. goto используются во многих местах. Ну, я всегда подозревал, что MFC писали ламеры. Смотрим дальше. CRT. Что это? И здесь goto? Список кандидатов на увольнение из Микрософт разрастается... Но ведь есть же ATL. Её писали настоящие ООП-пацаны, они не могут нас подвести. Как, и здесь goto? Поистине, мы живём в обществе потребления, без веры, без идеалов... Список можно продолжать. Загляните в исходники ядра Linux. Там вы тоже найдёте goto. Почему Linux-комьюнити до сих пор не переписала этот позорный код? Ы? Вот и я о том же.


S>Не, это не слишком удачные примеры. Linux вроде как на C писана, там goto нужнее. CRT — тоже. Что касается ATL, то в atlbase.h можно было легко обойтись без goto, не потеряв читабельности.

[skip]

Здесь речь не о том. Дело в том, что создатели Linux и библиотек Microsoft таки используют goto. По логике Влада это даёт нам право зачислить их в ламеры. Сделать это несложно, но таким образом можно ненароком прописать в ламеры и самого себя.


S>Не, исключения тут ни к чему — не для того их придумывали. Только объектные обертки — если подходящих классов нет, описываем прямо внутри foo(). Все шустро делается инлайновыми деструкторами, никакого проигрыша по сравнению с goto — одни плюсы.


Да, здесь согласен. C++ — богатый язык.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[2]: Выйти из двух циклов сразу
От: Whisperer  
Дата: 04.06.02 10:45
Оценка:
Здравствуйте Хитрик Денис, Вы писали:

ХД>Ребята, давайте завершать беседы об отвлечённых материях. По теме в последнее время достаточно мало было сказано

ХД>Если кто не успел высказаться, вперёд! Заводите новую тему и публикуйте в соответствующем форуме.

ХД>P.S. Хорошо, что темы пока нельзя закрывать А то закрыл бы и не случилось бы такого бурного обсуждения в почти чистом форуме С++


Я обсолютно с тобой согласен. Надо ввести опцию — убить тему — если определенное количество
пользователей высказалось убить — значить надо ее снести. Какое количество надо решить
методом голосования.
Re[9]: Выйти из двух циклов сразу
От: DNS Россия  
Дата: 04.06.02 11:08
Оценка:
Здравствуйте VladD2, Вы писали:

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


VD>Вообще-то моя задача была дать общую идею. Ну, да ладно, перепишим эквивалентно:


for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3;)
{
  for(;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {

[skip]


VD>Да в твоем случае дейсвтительно лишние извраты.


Сижу, читаю нитку...
Влад, что-то вы уже перемудрили, как раз эти 2 for-а и норовят запутать читающего, т.к.
не являются стандартным подходом к организации циклов. В первом отсутствует модификация,
во втором инициализация....

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

Успехов!
Д.Н.С.
Re[22]: Выйти из двух циклов сразу
От: Аноним  
Дата: 04.06.02 11:20
Оценка:
Во понаписали!!!
Re[13]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 04.06.02 11:23
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>>>Во-первых, мне не совсем понятно, почему для противники goto постоянно щеголяют приёмами из арсенала C++. Если goto противоречит принципам структурного программирования, давайте оперировать средствами языка C. То есть никаких исключений, объектных обёрток и пр.


S>>Не, это не честно. Неиспользование goto в C — это уже совсем другой вопрос. Я думаю, экстремистов, утверждающих, что goto не нужен в С куда меньше, чем протестующих против его использования в C++.


AS>Если бы мы спорили о том, какие средства C++ лучше применять, то ты был бы прав: C ни при чём. Но в этом треде утверждалось, что goto противоречит принципам структурного программирования, нарушает их и из-за этого плох. Ну, раз уж мы заговорили о структурном программировании, то давайте продемонстрируем несостоятельность goto в рамках чисто структурного языка. Кстати, вряд ли те же исключения можно причислить к структурному программированию.


Ну дык так и есть — goto противоречит принципам структурного программирования, нарушает их. И даже в какой-то мере плох из-за этого. Только из этого вовсе не следует, что его нельзя использовать. Чисто структурный подход достаточно беден сам по себе, а потому иногда, вместо того, чтобы привести к созданию более читаемых программ, приводит к прямо противоположному результату. Классический пример — очистка ресурсов. В принципе, обычно нет никаких проблем в том, чтобы реализовывать ее всегда без goto, только if'ами. Вот только если ресурсов более-менее много, лесенка if'ов не влезет даже на 22" монитор. И более читабельной/исправлябельной от отсутствия goto такая функция, естественно, не станет.

S>>Угу. Но break в стиле java был бы красивше. В общем-то, есть большая между return/break и goto — goto умеет прыгать назад.


AS>Ох, а ведь есть ещё setjmp/longjmp... ;)


А это сладкая парочка, AFAIK, считается с точки зрения структурного программирования еще более вредной, чем goto.

AS>>>В-четвёртых, по поводу квалификации программиста и зависимости количества goto от неё. Смеха ради я открыл папку VC6 и сделал по ней глобальный поиск. Что же я вижу? MFC. goto используются во многих местах. Ну, я всегда подозревал, что MFC писали ламеры. Смотрим дальше. CRT. Что это? И здесь goto? Список кандидатов на увольнение из Микрософт разрастается... Но ведь есть же ATL. Её писали настоящие ООП-пацаны, они не могут нас подвести. Как, и здесь goto? :???: Поистине, мы живём в обществе потребления, без веры, без идеалов... ;) Список можно продолжать. Загляните в исходники ядра Linux. Там вы тоже найдёте goto. Почему Linux-комьюнити до сих пор не переписала этот позорный код? Ы? Вот и я о том же.


S>>Не, это не слишком удачные примеры. Linux вроде как на C писана, там goto нужнее. CRT — тоже. Что касается ATL, то в atlbase.h можно было легко обойтись без goto, не потеряв читабельности.

AS>[skip]

AS>Здесь речь не о том. Дело в том, что создатели Linux и библиотек Microsoft таки используют goto. По логике Влада это даёт нам право зачислить их в ламеры. Сделать это несложно, но таким образом можно ненароком прописать в ламеры и самого себя. ;)


Про Linux ничего не скажу, я ейные исходники не разглядывал. А насчет ATL — я ж говорю, там в основном либо C, либо легаси код, перенесенный из того же С, который просто обломались переписать. Либо все-таки bad habits/недоделанность. В С допустимый, с моей точки зрения, набор ситуаций, когда можно использовать goto, гораздо шире и включает в себя не только выход из вложенных циклов, но и очистку ресурсов. А тяготеющая к goto очистка ресурсов нужна как минимум в сто раз чаще, чем выход из вложенных циклов. А насчет ламеризма Влад, как обычно, перегибает палку. Использование goto часто обусловленно не ламеризмом как таковым, а ленью (делать объектные обертки), отсутствием необходимости (переписывать legacy код) или недостатком времени (переписывать и отлаживать заново неструктурный унаследованный код, если в него все-таки приходиться вносить изменения). Скорее уж можно назвать ламеризмом использование флагов там, где проще написать goto :-\ Я уж не говорю про использование исключений для выхода из цикла :)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[14]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 04.06.02 11:51
Оценка:
Здравствуйте Sergey, Вы писали:

AS>>Ох, а ведь есть ещё setjmp/longjmp...


S>А это сладкая парочка, AFAIK, считается с точки зрения структурного программирования еще более вредной, чем goto.


Однако используется же. В основном как раз для эмуляции исключений и корректного освобождения ресурсов в глобальном масштабе. А это не семечки, такая система (написанная хорошо) не снижает, а повышает поддерживаемость/расширяемость.


AS>>Здесь речь не о том. Дело в том, что создатели Linux и библиотек Microsoft таки используют goto. По логике Влада это даёт нам право зачислить их в ламеры. Сделать это несложно, но таким образом можно ненароком прописать в ламеры и самого себя.


S>Про Linux ничего не скажу, я ейные исходники не разглядывал.


Про Linux могу сказать, что там во многих местах goto использован для повышения эффективности. В таких критичных местах, как планировщик, не станешь заморачиваться с лишними переменными/проверками/функциями, когда можно сделать то, что нужно, напрямик и без потерь.


S>А насчет ATL — я ж говорю, там в основном либо C, либо легаси код, перенесенный из того же С, который просто обломались переписать. Либо все-таки bad habits/недоделанность.


Скорее не из C, а из "старого C++", который мало что умел и поддерживал. Тем не менее, и у MS есть разные ситуации. Так, в MFC goto зачастую используется для выхода из вложенных циклов, которые бегают по картам сообщений (CWnd::OnWndMsg, CWinThread::DispatchThreadMessageEx и т. д.).
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[3]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.06.02 12:32
Оценка:
Здравствуйте Whisperer, Вы писали:

ХД>>Ребята, давайте завершать беседы об отвлечённых материях. По теме в последнее время достаточно мало было сказано

ХД>>Если кто не успел высказаться, вперёд! Заводите новую тему и публикуйте в соответствующем форуме.

ХД>>P.S. Хорошо, что темы пока нельзя закрывать А то закрыл бы и не случилось бы такого бурного обсуждения в почти чистом форуме С++


W>Я обсолютно с тобой согласен. Надо ввести опцию — убить тему — если определенное количество

W>пользователей высказалось убить — значить надо ее снести. Какое количество надо решить
W>методом голосования.

Я с вами не согласен, это один из немногих топиков, ради которых стоит читать не только ответы на свои вопросы.
Подробнее я высказался здесь
Автор: DarkGray
Дата: 04.06.02
Re[4]: Выйти из двух циклов сразу
От: Whisperer  
Дата: 04.06.02 12:42
Оценка:
Здравствуйте DarkGray, Вы писали:

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


ХД>>>Ребята, давайте завершать беседы об отвлечённых материях. По теме в последнее время достаточно мало было сказано

ХД>>>Если кто не успел высказаться, вперёд! Заводите новую тему и публикуйте в соответствующем форуме.

ХД>>>P.S. Хорошо, что темы пока нельзя закрывать А то закрыл бы и не случилось бы такого бурного обсуждения в почти чистом форуме С++


W>>Я обсолютно с тобой согласен. Надо ввести опцию — убить тему — если определенное количество

W>>пользователей высказалось убить — значить надо ее снести. Какое количество надо решить
W>>методом голосования.

DG>Я с вами не согласен, это один из немногих топиков, ради которых стоит читать не только ответы на свои вопросы.

DG>Подробнее я высказался здесь
Автор: DarkGray
Дата: 04.06.02


Тогда надо создать тему ТРЕП или как еще ее там (а вобщето вы меня убедили)

Re[15]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 04.06.02 13:00
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>>>Ох, а ведь есть ещё setjmp/longjmp... ;)


S>>А это сладкая парочка, AFAIK, считается с точки зрения структурного программирования еще более вредной, чем goto.


AS>Однако используется же. В основном как раз для эмуляции исключений и корректного освобождения ресурсов в глобальном масштабе. А это не семечки, такая система (написанная хорошо) не снижает, а повышает поддерживаемость/расширяемость.


Ага. Глобальных ресурсов — а это уже не структурно. Просто концепция структурного программирования, как и бритва Оккама, слишком острая и иногда (нечасто) отрезает некоторые существенные детали.

AS>>>Здесь речь не о том. Дело в том, что создатели Linux и библиотек Microsoft таки используют goto. По логике Влада это даёт нам право зачислить их в ламеры. Сделать это несложно, но таким образом можно ненароком прописать в ламеры и самого себя. ;)


S>>Про Linux ничего не скажу, я ейные исходники не разглядывал.


AS>Про Linux могу сказать, что там во многих местах goto использован для повышения эффективности. В таких критичных местах, как планировщик, не станешь заморачиваться с лишними переменными/проверками/функциями, когда можно сделать то, что нужно, напрямик и без потерь.


Только из этого не следует, что то, что при этом получится — структурное и легко модифицируемое. Да и ядро, IMHO, не сто человек пишут, и новичками их не назовешь. Наверняка ребята и в автокодах при необходимости программировать могут, что им какие-то goto :))

S>>А насчет ATL — я ж говорю, там в основном либо C, либо легаси код, перенесенный из того же С, который просто обломались переписать. Либо все-таки bad habits/недоделанность.


AS>Скорее не из C, а из "старого C++", который мало что умел и поддерживал. Тем не менее, и у MS есть разные ситуации. Так, в MFC goto зачастую используется для выхода из вложенных циклов, которые бегают по картам сообщений (CWnd::OnWndMsg, CWinThread::DispatchThreadMessageEx и т. д.).


Я ничего не имею против использования goto для выхода из вложенных циклов в C++ (и для выхода из вложенных циклов и очистки ресурсов в C). AFAIK, Страуструп тоже :) Не стоит быть святее папы римского. Но у тех же MS в том же ATL полно ошибочного кода или кода, написанного не плюсовым (с моей точки зрения), а значит, плохим для программирования на C++ стилем. И goto встречаются в основном в этом коде :)
Кстати, о стиле — вот взять dinkumware'вскую реализацию STL, написанную, если верить комментариям в исходниках, неким P.J. Plauger. Все ее ругают, говорят стиль плохой, не понятно нифига. А ентот самый P.J. Plauger, оказывается, в соавторстве с небезызвестным Пайком книгу написал о хорошем стиле кодирования. И вся "плохость" его стиля на поверку является всего лишь нетрадиционной расстановкой отступов и слишком короткими названиями переменных. Хотя если немного привыкнуть, оказывается, что именование переменных и приватных функций подчиняется там довольно жестким правилам, и код становится вполне понятным. Так что что такое хорошо, а что такое плохо применительно к программированию вопрос не столь уж простой (это адресовано тем, кто тему собирается грохнуть :) ).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 04.06.02 13:02
Оценка:
Здравствуйте Whisperer, Вы писали:

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


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


ХД>>>>Ребята, давайте завершать беседы об отвлечённых материях. По теме в последнее время достаточно мало было сказано

ХД>>>>Если кто не успел высказаться, вперёд! Заводите новую тему и публикуйте в соответствующем форуме.

ХД>>>>P.S. Хорошо, что темы пока нельзя закрывать А то закрыл бы и не случилось бы такого бурного обсуждения в почти чистом форуме С++


W>>>Я обсолютно с тобой согласен. Надо ввести опцию — убить тему — если определенное количество

W>>>пользователей высказалось убить — значить надо ее снести. Какое количество надо решить
W>>>методом голосования.

DG>>Я с вами не согласен, это один из немногих топиков, ради которых стоит читать не только ответы на свои вопросы.

DG>>Подробнее я высказался здесь
Автор: DarkGray
Дата: 04.06.02


W>Тогда надо создать тему ТРЕП или как еще ее там (а вобщето вы меня убедили)


W>


Да какой там треп ? Это же одна из важнейших дилемм в программировании!
Очень интересная тема (хотя и избитая), с удовольствием читаю все сообщения.
Все гениальное — просто
Re[11]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 04.06.02 14:52
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Ну и последнее. По поводу надуманности примеров, где goto реально помогает. На мой взгляд, даже в Windows-программировании такие случаи бывают. Вот самый что ни есть типичный сценарий (напоминаю, пока мы остаёмся в рамках C):


AS>
void foo()
{
...
   // Работаем с данными

failure:
   bResult = FALSE;

cleanup:
...
   return bResult;
}


Во-первых. Ты всё же зря не привёл ни одного примера goto здесь. В большинстве случаев, он не используется напрямую, для него пишутся макросы в которые он заворачивается вместе и if'ом и установкой кода ошибки. Да и сами метки делаются макросами и имеют всегда предопределённые имена.

Во-вторых. Эта техника призвана решать одну проблему старого C, которая заменяется в C++ деструкторами (и не надо нас уговаривать оставаться в рамках C навсегда ;o) ) Я уверен, что большинство примеров, о которых ты говорил используют goto именно для этих целей. Это всего лишь попытка имулировать деструкты, больше ничего, вынужденная мера для обхода ограничений языка. В конце концов о jmp в ассемблере никто не спорит. Но это далеко не использование goto для построения самой логики приложения, как нам предлагает WolfHound. А мы, как я понимаю, спорим именно об этом.

В-третьих. Я ещё могу привести пример, где широко используется goto примерно для таких же целей. Написание COM-объектов на чистом API, установка HRESULT и выход из метода. Но что-то никто не хвалит эту технологию как продвинутую, все пишут на ATL. Не потому ли, что старый подход с goto глюкастее и сложнее?

В-четвёртых. Можно тот же код с очисткой ресурсов написать и без всего этого. Я писал на C года четыре и прекрасно обходился без подобной техники. Можем проверить, давай код с goto, я его перепишу на if'ы. ;o)
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 04.06.02 19:39
Оценка:
Здравствуйте Patalog, Вы писали:

P>Ну, представь себе такую ситуацию.

P>Есть некий прибор, управляется ета хрень какой-нибудь двушкой в железном ящичке под голым досом. Энтих приборчиков энное количество по всему миру (например в Нижнезадрюпенской области, городе Мухосраннске).

Представляю. Даже назвать могу. И не пот "двушечкой", а под C51 и иже с ним. И не под "досом", а под своей операционкой. Французской — страшная вещь! Вино у них хорошее, а вот программеры... Знаете как все это назвается? Это называется сеть POS-терминалов...

P>Maintenance с точки зрения новых красивых фенечек ненужен\невозможен по двум причинам — как ты представляешь обновление софта в этой ситуации? И, второе, железо (приборчик) рабоает на пределе, и новых фенечек из него не высосешь. Да и не нужны они, себестоимость тоже нужно учитывать.


Вот так вот и представляешь себе обновление софта. И добавление фенечек и рюшечек. И управление всей сетью. И еще много чего. И приборчик работает на пределе. И новые фенечки из него высасывать надо, потому что с рынка улетишь в два счета — конкуренты не дремлют. А приходит новая "железячка": старый софт выбрасывать, да? Вот IT (если я ничего не перепутал) работал в этой сфере — он может подтвердить.

Так что и этот пример, увы, надуман...
Голь на выдумку хитра, однако...
Re[11]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 04.06.02 19:47
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Собственно, я вмешался, так как хочу выступить в защиту goto. Влад говорил, что первая двадцатка топа его поддержит. Ну, я уже давно из неё выбыл, так что мне можно.


Ну, недолго музычка играла, так что теперь уже снова нельзя...
Голь на выдумку хитра, однако...
Re[12]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 19:53
Оценка:
Здравствуйте Sergey, Вы писали:

S>Здравствуйте Alexander Shargin, Вы писали:


AS>>Во-первых, мне не совсем понятно, почему для противники goto постоянно щеголяют приёмами из арсенала C++. Если goto противоречит принципам структурного программирования, давайте оперировать средствами языка C. То есть никаких исключений, объектных обёрток и пр.


S>Не, это не честно. Неиспользование goto в C — это уже совсем другой вопрос. Я думаю, экстремистов, утверждающих, что goto не нужен в С куда меньше, чем протестующих против его использования в C++.


Дык, одной из задач при разработке C++ было избавление от вынужденного использования неструктурированноых goto. Кстати, в тот же С структурную обработку иключений ввели и даже лучше чем в С++. А мы всю жизнь COM-объекты на ATL делали без нее и ничего. Ни одного goto в коде и все работает.

AS>>Кстати, в Java goto убрали, но расширили синтаксис break для выхода из вложенных циклов. Похоже, ребята рассуждали похожим образом.


S>И правильно сделали. А комитет по стандартизации C++ правильно делает, что goto не убирает. Хотя break усовершенствовать не помешало бы —


Согласен.

S>глядишь, goto только в legacy коде и остался бы.


А вот тут нет. Посмотри на голосование. 100%-ых противников goto 5 человек (тебя я там не вдел , а сторонников довольно моного). Еще больше удручает C++-ый код того же MS. Там порою встречается идеальный и красивый код, а иногда вот такие прерлы:

HRESULT CFile::CopyFile(IMetaDataDispenserEx *pDisp, bool bCleanup)
{
    HRESULT hr = S_OK;
    if (m_SrcFile != NULL && _wcsicmp(m_SrcFile, m_Path) != 0) {
        if (W_CopyFile(m_SrcFile, m_Path, FALSE) == FALSE)
            return ReportError(HRESULT_FROM_WIN32(GetLastError()));
        bCleanup = true;
    } else
        hr = S_FALSE; // FLASE because we did nothing

    if (bCleanup) {
        mdToken tkAR, tkAttrib[4] = {mdTokenNil, mdTokenNil, mdTokenNil, mdTokenNil };
        const static WCHAR names [4][2] = {  {0,0}, {'S', 0}, {'M', 0}, {'S', 'M'} };
        CTokenMap Map;
        ALPEFile module;
        CComPtr<IMetaDataEmit> pNewEmit, pOldEmit;
        CComPtr<IMetaDataAssemblyImport> pAImport;
        CComPtr<IMetaDataFilter> pFilter;
        ULONG count;
        mdAssemblyRef ar[4];
        HCORENUM hEnum = NULL;

        if (FAILED(hr = module.OpenFileAs( pDisp, m_Path, true, true)))
            // A COM+ or WIN32 error
            goto CLEANUP;

        if (FAILED(hr = pDisp->DefineScope(CLSID_CorMetaDataRuntime,   // Format of metadata
                                           0,                           // flags
                                           IID_IMetaDataEmit,           // Emitting interface
                                           (IUnknown **) &pNewEmit)))
            goto CLEANUP;

        if (FAILED(hr = module.pImport->QueryInterface(IID_IMetaDataAssemblyImport, (void**)&pAImport))||
            FAILED(hr = module.pImport->QueryInterface(IID_IMetaDataEmit, (void**)&pOldEmit)) ||
            FAILED(hr = module.pImport->QueryInterface(IID_IMetaDataFilter, (void**)&pFilter)))
            goto CLEANUP;


        while (SUCCEEDED(pAImport->EnumAssemblyRefs( &hEnum, ar, lengthof(ar), &count)) && count > 0) {
            ULONG len = 0;
            WCHAR buffer[32];
            for (ULONG i = 0; i < count; i++) {
                if (FAILED(hr = pAImport->GetAssemblyRefProps( ar[i], NULL, NULL, buffer, lengthof(buffer), &len, NULL, NULL, NULL, NULL))) {
                    pAImport->CloseEnum(hEnum);
                    goto CLEANUP;
                }
                if (len == 9 && wcscmp(buffer, L"mscorlib") == 0) {
                    tkAR = ar[i];
                    pAImport->CloseEnum(hEnum);
                    goto FoundMscorLib;
                }
            }
        }
        pAImport->CloseEnum(hEnum);
        tkAR = mdTokenNil;

FoundMscorLib:
        pAImport = NULL; // Release it

        for (int i = 0; i < 4 && SUCCEEDED(hr); i++) {
            WCHAR name[1024];
            wcscpy(name, MODULE_CA_LOCATION);
            mdToken tkAssem = mdTokenNil;
            wcscat(name, names[i]);
            // Try both a scoped and unscoped reference
            if (FAILED(hr = module.pImport->FindTypeRef(tkAR, name, &tkAssem)) &&
                (hr != CLDB_E_RECORD_NOTFOUND || tkAR == mdTokenNil || FAILED(hr = module.pImport->FindTypeRef(mdTokenNil, name, &tkAssem)))) {
                if (hr == CLDB_E_RECORD_NOTFOUND) {
                    hr = S_FALSE;
                    continue;
                } else
                    break;
            }

            tkAttrib[i] = tkAssem;
            if (!IsNilToken(tkAssem)) {
                DeleteToken func(pOldEmit);
                hr = EnumAllExcept( module.pImport, &func, tkAssem, NULL, 0, NULL, &CallEnumCustomAttributes);
            }
        }
        pOldEmit = NULL;
        if (FAILED(hr) || FAILED(hr = pFilter->UnmarkAll()))
            goto CLEANUP;

        {
            MarkToken func(pFilter);

            if (FAILED(hr = EnumAllExcept( module.pImport, &func, &CallEnumUserStrings, NULL, 0, NULL)) ||
                FAILED(hr = EnumAllExcept( module.pImport, &func, &CallEnumSignatures, NULL, 0, NULL)) ||
                FAILED(hr = EnumAllExcept( module.pImport, &func, &CallEnumTypeDefs, NULL, 0, &CallEnumMembers)) ||
                // Get Global functions/methods
                FAILED(hr = EnumAllExcept( module.pImport, &func, mdTokenNil, NULL, 0, &CallEnumMembers)) ||
                FAILED(hr = EnumAllExcept( module.pImport, &func, &CallEnumTypeRefs, tkAttrib, lengthof(tkAttrib), &CallEnumMemberRefs)) ||
                // Get Global functions/methods
                FAILED(hr = EnumAllExcept( module.pImport, &func, mdTokenNil, tkAttrib, lengthof(tkAttrib), &CallEnumMemberRefs)) ||
                FAILED(hr = EnumAllExcept( module.pImport, &func, &CallEnumTypeSpecs, NULL, 0, NULL)))
                goto CLEANUP;
        }

        if (FAILED(hr = pNewEmit->SetModuleProps(GetModuleName())))
            goto CLEANUP;


        if (FAILED(hr = pNewEmit->Merge( module.pImport, &Map, NULL)) ||
            FAILED(hr = pNewEmit->MergeEnd()) ||
            FAILED(hr = pNewEmit->GetSaveSize((CorSaveSize)(cssAccurate | cssDiscardTransientCAs), &count)))
            goto CLEANUP;

        if (FAILED(hr = module.EmitMembers( NULL, NULL, NULL, NULL, NULL, &Map, pNewEmit)) ||
            FAILED(hr = module.WriteNewMetaData(pNewEmit, count)) ||
            FAILED(hr = module.Close()))
            hr = ReportError(hr);

CLEANUP:; // Клинап, блин! :)
    }

    return hr;
}


S>Вот именно! Функция должна выполнять логически завершенное действие, а не служить заменой циклу. Уж лучше goto.


Лучше код разумно писать, тогда и нагромождения циклов не будет. Да и никто не мешает на обычных ифах жить. Все равно оптимизатор все переделает так, что мама родная не узнает.

S>Что касается ATL, то в atlbase.h можно было легко обойтись без goto, не потеряв читабельности. atlcom.h — CSecurityDescriptor::GetTokenSids и CSecurityDescriptor::Attach, по-моему, написаны не слишком тщательно, там при некоторых ошибках лики вроде могут быть (да и код этот явно унаследованный). atldb.h — одно большое глюкало, явно писалось на скорую руку (когда пришлось однажды его использовать, нашел кучу разнообразных утечек). statreg.h — в CRegObject::RegisterFromResource (написанной в сишном стиле, кстати) от goto без труда можно было бы избавиться (вроде даже без объектных оберток); в CRegParser::RegisterSubkeys вообще хрен чего поймешь, что с goto, что без него — код явно write-only , напрашивается на полное переписывание при необходимости малейшей модификации. Так что насчет "настоящих ООП-пацанов" я сильно не уверен


ATL разные люди писали. Таб были и откровнные ламеры и крутые.

Кстати если посчитать количесвто goto в ATL, то окажется, что там их совесем не много и используется они приимущественно в целях обработки ошибок (VC6 реализовывал try/catch на CRT, от которого ATL-щики избавлялись). Ну, а в WTL вообще нельзя найти ни одного goto (хотя и там ламеры были). У на 5 мегов кода и ни одного goto и ничего живем и все работает.

AS>>В-третьих, любители жить без CRT тоже не очень-то жалуют исключения (и ATL/WTL вполне поддерживают такой стиль жизни).


Ну, вот мы как раз такие любители, ну, и что? Ни одного goto нет и CRL не ципляем. И вообще ресурсы в ручную не выделяем все на обертках.

S>А без CRT — это уже не С++, а "С с классами", да и то урезанный.


Ну, тут ты не прав. Для C++ под Виндовс CRT ненужна. Мы вон сделали 10 оберток над API-шными функциями и все прекрасно работает. Даже STL-ю по большому счету CRT не нужен (хотя мне STL не нравится).

AS>>Можно приводить и другие примеры. Про встроенные/низкоуровневые системы, которые с основном пишутся на C, тут уже сказали, и я с этим согласен.


Блин. Задолбал ты со своим С. Здесь речь шла о С++.

AS>>Резюме. Я призиваю участников этого флейма не быть такими категоричными. Эту ветку могут читать начинающие. Не надо прессовать им мозги "незыблемыми правилами". Лучше поучите их думать головой.


Так вот используя goto головой люди обычно и не думают. По этому я призываю начинающих думать головой и никогда не использовать goto.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 04.06.02 20:00
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

IT>>>>В-четвёртых. Можно тот же код с очисткой ресурсов написать и без всего этого. Я писал на C года четыре и прекрасно обходился без подобной техники. Можем проверить, давай код с goto, я его перепишу на if'ы.


AS>>>Я и сам могу. Вопрос, будет ли твой вариант более читабельным. Думаю, что совсем не обязательно.


IT>>Естественно, цепочки if'ов тоже не лучший пример читабельности, но они вполне нормально заменяют технику, показанную тобой.


AS>Я скажу больше: они хуже, так как затрудняют и понимание, и расширяемость. Ты сам заметил, что метод с goto сильно напоминает эмуляцию деструкторов, которые и являются наилучшим решением данной задачи. Если в функцию добавляется ещё один ресурс, при моём подходе достаточно:

AS>- добавить его в секцию переменных
AS>- добавить код очистки в конец
AS>- работать с ресурсом как ни в чём не бывало.

Мда... В одном проекте, доставшемся мне по наследству, такой метод и используется... Честно? Я уже измучился и никак не перепишу это только потому, что проект работает себе и в данный момент дополнений/обновлений/исправлений (тьфу-тьфу-тьфу) не требует. Но все новое мной написаное в этом проекте от этого приема отошло! Не помню точно почему именно. Завтра подниму проект и скажу.
Голь на выдумку хитра, однако...
Re[13]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 20:19
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Если бы мы спорили о том, какие средства C++ лучше применять, то ты был бы прав: C ни при чём. Но в этом треде утверждалось, что goto противоречит принципам структурного программирования, нарушает их и из-за этого плох. Ну, раз уж мы заговорили о структурном программировании, то давайте продемонстрируем несостоятельность goto в рамках чисто структурного языка. Кстати, вряд ли те же исключения можно причислить к структурному программированию.


Я, кстати, говорил, что единственное место где можно смериться с goto, это обработка ошибок в отстутсвии возможности создать врапер или использовать try. Так вот к Ричевский C — это как раз тот случай убогости языка в которой обработка ошибок и очистка ресурсов без goto сильно затруднена. С вообще довольно "грязный" язык и именно по этму не надо его брать в идеалы структурного программирования. А то можно еще порассцждать о необходимости костркций goto в первых реализациях бэйсика...

AS>Здесь речь не о том. Дело в том, что создатели Linux и библиотек Microsoft таки используют goto. По логике Влада это даёт нам право зачислить их в ламеры. Сделать это несложно, но таким образом можно ненароком прописать в ламеры и самого себя. ;)


За Линуксойдов не скажу (про С я уже говорил), а вот то, про орлов из MS сказать могу. Недавно рассматривал код CLI (сабсет .Net портируемый) там сразу видно кто код писал. Люди делятся на три категории:

1. Старперы. Те что с С преешли на С++ но разбираться им в этом языке в лом.
2. Нормальные программисты. Их код любо дорого читать.
3. Натуральные ламеры. Им вооще качество кода по барабану.

И скорее всего они пред открытием кода его тщательно причесывали. Отсуда сделал вывод, что конторах типа MS код пишится отдельными личностями на заказ. У них о культуре кода вообще говорить невозможно. Там в отдном каталоге 5 стилей.

PS

Вот кусочек кода из ATL содежащий goto. Именно о нем Sergey не очень лестно отзывался.


    HRESULT    GetPropertyInfo(ULONG cPropertySets, 
                        const DBPROPIDSET rgPropertySets[], ULONG* pcPropertyInfoSets,
                        DBPROPINFOSET**    prgPropertyInfoSets, 
                        WCHAR** ppDescBuffer, bool bInitialized = true, 
                        const GUID* pGuid = NULL)
    {
        CComCritSecLock<CComAutoCriticalSection> lock(m_oCriticalSection);
        HRESULT    hr = S_OK;
        ULONG ul, ulSet, ulNext, ulEnd;
        ULONG ulOutIndex;
        ULONG cSets;
        ULONG cPropInfos;
        //ULONG ulIndex = 0;
        ULONG cBuffers = 0;
        DWORD dwStatus = 0;
        DBPROPINFO*    pPropInfo = NULL;
        DBPROPINFO*    pCurPropInfo = NULL;
        WCHAR* pDescBuffer = NULL;
        DBPROPINFOSET* pPropInfoSet = NULL;
        UPROPINFO* pUPropInfo = NULL;
        WCHAR wszBuff[256];
        int    cch;
        CAtlArray<ULONG> rgInitPropsetIndexes;

        // If the consumer does not restrict the property sets
        // by specify an array of property sets and a cPropertySets
        // greater than 0, then we need to make sure we 
        // have some to return
        if(cPropertySets == 0)
        {
            // Determine the number of property sets supported
            // In this case, it usually the enumerator or data source asking for 
            // DBPROPSET_DBINIT information.

            if (pGuid != NULL)
            {
                // Need to determine if there are any UPROPSET_USERINIT sets here
                // they should be added to DBINIT.
                ULONG ulUserInitSets = 0;
                for (ULONG l=0; l<m_cUPropSet; l++)
                    if (m_pUPropSet[l].dwFlags & UPROPSET_USERINIT)
                        ulUserInitSets++;

                cSets = 1 + ulUserInitSets;        // one for DBINIT which is required
            }
            else
            {
                cSets = m_cUPropSet;
            }
        }
        else
        {
            cSets = 0;

            // Determine number of property sets required 
            // This is only required when any of the "special" property set GUIDs were specified
            for(ulSet=0; ulSet<cPropertySets; ulSet++)
            {
                if (GetPropertySetIndex(&(rgPropertySets[ulSet].guidPropertySet)) == S_OK)
                    cSets += m_cPropSetDex;
                else
                    cSets++;
            }
        }
        ATLASSERT(cSets);

        // Allocate the DBPROPINFOSET structures
        pPropInfoSet = (DBPROPINFOSET*)CoTaskMemAlloc(cSets * sizeof(DBPROPINFOSET));
        if(pPropInfoSet == NULL)
        {
            ATLTRACE(atlTraceDBProvider, 0, _T("Could not allocate DBPROPSET array for GetProperties\n"));
            hr =  E_OUTOFMEMORY;
            goto EXIT;
        }

        memset(pPropInfoSet, 0, cSets * sizeof(DBPROPINFOSET));

        ulOutIndex = 0;
        ULONG ulTempPropsetIndex = 0;
        ulEnd = cPropertySets == 0 ? cSets : cPropertySets; 
        // Fill in the output array
        for(ulSet=0; ulSet<ulEnd; ulSet++)
        {
             // Depending of if Property sets are specified store the
            // return property set.
            if (cPropertySets == 0)
            {
                if (pGuid != NULL)
                {
                    // Need to change this: set the guidPropertySet to the maching
                    // initialization property group (not DBINITALL).
                    for (ULONG ulCurrentInitSet = ulTempPropsetIndex; ulCurrentInitSet < m_cUPropSet; ulCurrentInitSet++)
                    {
                        // We need to locate either the DBINIT or USERINIT property sets here
                        // and set the property set index up correctly.
                        if (InlineIsEqualGUID(*(m_pUPropSet[ulCurrentInitSet].pPropSet), DBPROPSET_DBINIT) ||
                            (m_pUPropSet[ulCurrentInitSet].dwFlags & UPROPSET_USERINIT))
                        {
                            rgInitPropsetIndexes.Add(ulCurrentInitSet);
                            ulTempPropsetIndex = ulCurrentInitSet + 1;
                            //ulIndex = ulCurrentInitSet;
                            //pPropInfoSet[ulSet].guidPropertySet = *pGuid;
                            pPropInfoSet[ulSet].guidPropertySet = *(m_pUPropSet[ulCurrentInitSet].pPropSet);
                            GetPropertySetIndex(&pPropInfoSet[ulSet].guidPropertySet);    // Need to set the m_cPropSetDex variable
                            break;
                        }
                    }
                    //if (ulCurrentInitSet == m_cUPropSet)
                    //{
                    //    ulIndex = 0;
                    //}

                }
                else
                {
                    pPropInfoSet[ulSet].guidPropertySet = *(m_pUPropSet[ulSet].pPropSet);
                }
            }
            else
            {
                GUID const& guidSet = rgPropertySets[ulSet].guidPropertySet;
                if( (InlineIsEqualGUID(guidSet, DBPROPSET_DATASOURCEALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_DATASOURCEINFOALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_DBINITALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_SESSIONALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_COLUMNALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_CONSTRAINTALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_INDEXALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_TABLEALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_TRUSTEEALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_VIEWALL) ||
                    InlineIsEqualGUID(guidSet, DBPROPSET_ROWSETALL)) &&
                    GetPropertySetIndex(&guidSet) == S_OK )
                {
                    for(ul=0; ul<m_cPropSetDex; ul++,ulOutIndex++)
                    {
                        pPropInfoSet[ulOutIndex].guidPropertySet    = *(m_pUPropSet[m_rgiPropSetDex[ul]].pPropSet);
//                        pPropInfoSet[ulOutIndex].guidPropertySet    = rgPropertySets[ulSet].guidPropertySet;
                        pPropInfoSet[ulOutIndex].cPropertyInfos        = 0;
                    }
                }
                else
                {
                    // Handle non-category property sets
                    // Handle unknown property sets
                    pPropInfoSet[ulOutIndex].guidPropertySet = guidSet; 
                    pPropInfoSet[ulOutIndex].cPropertyInfos     = rgPropertySets[ulSet].cPropertyIDs; 
                    ulOutIndex++;
                }
            }
        }

        // Allocate a Description Buffer if needed
        if( ppDescBuffer )
        {
            cBuffers = CalcDescripBuffers(cSets, pPropInfoSet);
            if( cBuffers != 0 )
            {
                pDescBuffer = (WCHAR*)CoTaskMemAlloc(cBuffers * cchDescBuffSize * sizeof(WCHAR));
                if(pDescBuffer == NULL)
                {
                    hr = E_OUTOFMEMORY;
                    goto EXIT;
                }
                *ppDescBuffer = pDescBuffer;
                memset(pDescBuffer, 0, (cBuffers * cchDescBuffSize * sizeof(WCHAR)));
            }
        }

        // Process requested or derived Property sets
        dwStatus = 0;
        for(ulSet=0; ulSet<cSets; ulSet++)
        {
            ulNext=0;
            cPropInfos = 0;
            pPropInfo = NULL;
            dwStatus &= (GETPROPINFO_ERRORSOCCURRED | GETPROPINFO_VALIDPROP);

            // Calculate the number of property nodes needed for this
            // property set.
            if( cPropertySets == 0 )
            {
                ULONG ulTempSet;
                if (pGuid != NULL)
                {
                    ATLASSERT( ulSet < rgInitPropsetIndexes.GetCount() );
                    ulTempSet = rgInitPropsetIndexes[ulSet]; // ulIndex;
                }
                else
                    ulTempSet = ulSet;

                cPropInfos = m_pUPropSet[ulTempSet].cUPropInfo;
                dwStatus |= GETPROPINFO_ALLPROPIDS;
                m_rgiPropSetDex[0] = ulTempSet;
                m_cPropSetDex = 1; 
                _ATLDUMPPROPSETIID(*m_pUPropSet[ulTempSet].pPropSet, dwStatus);
            }
            else
            {
                // If the count of PROPIDs is 0 (NOTE: the above routine already determined
                // if it belonged to a category and if so set the count of properties to 0 for
                // each propset in that category.
                if( pPropInfoSet[ulSet].cPropertyInfos == 0 )
                {
                    dwStatus |= GETPROPINFO_ALLPROPIDS;
                    // We have to determine if the property set is supported and if so
                    // the count of properties in the set.
                    if( (GetPropertySetIndex(&(pPropInfoSet[ulSet].guidPropertySet)) == S_FALSE)
                        || (!bInitialized && 
                        !(InlineIsEqualGUID(pPropInfoSet[ulSet].guidPropertySet, DBPROPSET_DBINIT)) &&
                        !(InlineIsEqualGUID(pPropInfoSet[ulSet].guidPropertySet, DBPROPSET_DBINITALL))))
                    {
                        dwStatus |= GETPROPINFO_NOTSUPPORTED;
                        dwStatus |= GETPROPINFO_ERRORSOCCURRED;
                        _ATLDUMPPROPSETIID(pPropInfoSet[ulSet].guidPropertySet, dwStatus);
                        goto NEXT_SET;
                    }
                    else                        
                    {
                        ATLASSERT( m_cPropSetDex == 1 );
                        cPropInfos += m_pUPropSet[m_rgiPropSetDex[0]].cUPropInfo;
                        _ATLDUMPPROPSETIID(pPropInfoSet[ulSet].guidPropertySet, dwStatus);
                    }
//                    else
//                    {
//                        // Not Supported                    
//                        dwStatus |= GETPROPINFO_ERRORSOCCURRED;
//                        goto NEXT_SET;
//                    }
                }
                else
                {
                    // We also handle the case here where the user has requested
                    // a non-initialization group property info set while the
                    // provider is not initialized.  In this case, properties should
                    // not be set.
                    cPropInfos = pPropInfoSet[ulSet].cPropertyInfos;
                    if( (GetPropertySetIndex(&(pPropInfoSet[ulSet].guidPropertySet)) == S_FALSE)
                        || (!bInitialized && 
                        !(InlineIsEqualGUID(pPropInfoSet[ulSet].guidPropertySet, DBPROPSET_DBINIT)) &&
                        !(InlineIsEqualGUID(pPropInfoSet[ulSet].guidPropertySet, DBPROPSET_DBINITALL))))
                    {
                        dwStatus |= GETPROPINFO_NOTSUPPORTED;
                        dwStatus |= GETPROPINFO_ERRORSOCCURRED;
                        _ATLDUMPPROPSETIID(pPropInfoSet[ulSet].guidPropertySet, dwStatus);
                    }
                }
            }


            // Allocate DBPROP array
            ATLASSERT( cPropInfos != 0 );
            pPropInfo = (DBPROPINFO*)CoTaskMemAlloc(cPropInfos * sizeof(DBPROPINFO));
            if( pPropInfo )
            {
                // Initialize Buffer
                memset(pPropInfo, 0, cPropInfos * sizeof(DBPROPINFO));
                for(ULONG ulProp=0; ulProp<cPropInfos; ulProp++)
                {
                    VariantInit(&(pPropInfo[ulProp].vValues));
                    if( dwStatus & GETPROPINFO_NOTSUPPORTED )
                    {
                        // Not supported, thus we need to mark all as NOT_SUPPORTED
                        pPropInfo[ulProp].dwPropertyID = rgPropertySets[ulSet].rgPropertyIDs[ulProp];
                        pPropInfo[ulProp].dwFlags = DBPROPFLAGS_NOTSUPPORTED;
                        dwStatus |= GETPROPINFO_ERRORSOCCURRED;
                        _ATLDUMPPROPERTY(pPropInfo[ulProp].dwPropertyID, pPropInfo[ulProp].dwFlags);
                    }                    
                }
                // Make sure we support the property set
                if( dwStatus & GETPROPINFO_NOTSUPPORTED )
                {
                    ulNext = cPropInfos;
                    goto NEXT_SET;
                }

                // Retrieve the property information for this property set
                for(ul=0; ul<m_cPropSetDex; ul++)
                {
                    pUPropInfo = (m_pUPropSet[m_rgiPropSetDex[ul]].pUPropInfo);
                    ATLASSERT( pUPropInfo );

                    // Retrieve current value of properties
                    if( dwStatus & GETPROPINFO_ALLPROPIDS )
                    {
                        for(ulProp=0; ulProp<m_pUPropSet[m_rgiPropSetDex[ul]].cUPropInfo; ulProp++)
                        {
                            // Verify property is supported, if not do not return 
                            if( !TESTBIT(&(m_rgdwSupported[m_rgiPropSetDex[ul] * m_cElemPerSupported]), ulProp) )
                                continue;

                            pCurPropInfo = &(pPropInfo[ulNext]);

                            // If the ppDescBuffer pointer was not NULL, then
                            // we need supply description of the properties
                            if( ppDescBuffer )
                            {
                                // Set Buffer pointer
                                pCurPropInfo->pwszDescription = pDescBuffer;

                                // Load the string into temp buffer
                                cch = LoadDescription(pUPropInfo[ulProp].ulIDS, wszBuff, (sizeof(wszBuff)/sizeof(*wszBuff)));
                                if( cch )
                                {
                                    // Adjust for '\0'
                                    cch++;

                                    // Transfer to official buffer if room
                                    memcpy(pDescBuffer, wszBuff, cch * sizeof(WCHAR));
                                    pDescBuffer += cch;
                                }
                                else
                                {
                                    wcscpy(pDescBuffer, L"UNKNOWN");
                                    pDescBuffer += (wcslen(L"UNKNOWN") + 1);
                                    _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, ATLDB_NO_STRING);
                                }
                            }

                            pCurPropInfo->dwPropertyID = pUPropInfo[ulProp].dwPropId;

                            // Strip out any user defined flags that may be around.  Note,
                            // this isn't a full-proof thing because properties change.  It
                            // won't work in OLE DB 2.5 if someone does a property like 0x40000
                            DWORD dwFlags = pUPropInfo[ulProp].dwFlags & 0xfffff;

                            pCurPropInfo->dwFlags = dwFlags;
                            pCurPropInfo->vtType = pUPropInfo[ulProp].VarType;
                            pCurPropInfo->vValues.vt = VT_EMPTY;

                            dwStatus |= GETPROPINFO_VALIDPROP;
                            // Increment to next available buffer
                            ulNext++;
                            _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, pCurPropInfo->dwFlags);
                        }
                    }
                    else
                    {
                        ATLASSERT( m_cPropSetDex == 1 );
                        ULONG cIterations = ((cPropInfos>cBuffers) && (ppDescBuffer)) ? cBuffers : cPropInfos;

                        for( ulProp = 0; ulProp < cIterations; ulProp++, ulNext++ )
                        {
                            pCurPropInfo = &(pPropInfo[ulNext]);

                            // Process Properties based on Restriction array.
                            pCurPropInfo->dwPropertyID = rgPropertySets[ulSet].rgPropertyIDs[ulProp];

                            if( GetUPropInfoPtr(m_rgiPropSetDex[ul], pCurPropInfo->dwPropertyID, &pUPropInfo)
                                == S_OK )
                            {
                                // If the ppDescBuffer pointer was not NULL, then
                                // we need supply description of the properties
                                if( ppDescBuffer )
                                {
                                    // Set Buffer pointer
                                    pCurPropInfo->pwszDescription = pDescBuffer;

                                    // Load the string into temp buffer
                                    cch = LoadDescription(pUPropInfo->ulIDS, wszBuff, (sizeof(wszBuff)/sizeof(*wszBuff)));
                                    if( cch )
                                    {
                                        // Adjust for '\0'
                                        cch++;

                                        // Transfer to official buffer if room
                                        memcpy(pDescBuffer, wszBuff, cch * sizeof(WCHAR));
                                        pDescBuffer += cch;
                                    }
                                    else
                                    {
                                        wcscpy(pDescBuffer, L"UNKNOWN");
                                        pDescBuffer += (wcslen(L"UNKNOWN") + 1);
                                        _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, ATLDB_NO_STRING);
                                    }
                                }

                                pCurPropInfo->dwPropertyID = pUPropInfo->dwPropId;

                                // Strip out any user defined flags that may be around.  Note,
                                // this isn't a full-proof thing because properties change.  It
                                // won't work in OLE DB 2.5 if someone does a property like 0x40000
                                DWORD dwFlags = pUPropInfo->dwFlags & 0xfffff;

                                pCurPropInfo->dwFlags = dwFlags;
                                pCurPropInfo->vtType = pUPropInfo->VarType;

                                dwStatus |= GETPROPINFO_VALIDPROP;
                            }
                            else
                            {
                                // Not Supported
                                pCurPropInfo->dwFlags = DBPROPFLAGS_NOTSUPPORTED;
                                dwStatus |= GETPROPINFO_ERRORSOCCURRED;
                            }
                            _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, pCurPropInfo->dwFlags);
                        }
                    }
                }
            }
            else
            {
                hr = E_OUTOFMEMORY;
                goto EXIT;
            }

NEXT_SET:
            pPropInfoSet[ulSet].cPropertyInfos = ulNext;
            pPropInfoSet[ulSet].rgPropertyInfos = pPropInfo;
        }

        // Success, set return values
        *pcPropertyInfoSets = cSets;
        *prgPropertyInfoSets = pPropInfoSet;

        // At least one propid was marked as not S_OK
        if( dwStatus & GETPROPINFO_ERRORSOCCURRED )
        {
            // If at least 1 property was set
            if( dwStatus & GETPROPINFO_VALIDPROP )
                return DB_S_ERRORSOCCURRED;
            else
            {
                // Do not free any of the rgPropertyInfoSets, but
                // do free the ppDescBuffer
                if( pDescBuffer )
                {
                    ATLASSERT( ppDescBuffer );
                    CoTaskMemFree(pDescBuffer);
                    *ppDescBuffer = NULL;
                }
                return DB_E_ERRORSOCCURRED;
            }
        }

        return S_OK;
EXIT:
        // Check if failure and clean up any allocated memory
        if( FAILED(hr) && 
            (hr != DB_E_ERRORSOCCURRED) )
        {
            // Free Description Buffer
            if( pDescBuffer )
            {
                ATLASSERT( ppDescBuffer );

                CoTaskMemFree(pDescBuffer);
                *ppDescBuffer = NULL;
            }

            if( pPropInfoSet )
            {
                // Loop through Property Sets
                for(ulSet=0; ulSet<cSets; ulSet++)
                    CoTaskMemFree(pPropInfoSet[ulSet].rgPropertyInfos);
                CoTaskMemFree(pPropInfoSet);
            }
        }

        return hr;
    }



Я бы на метсе менеджеров из MS со стыда бы сгарел. :(

Это мог написать только ламер. Ведь он тачно слышал об обертках. И скорее всего ему объясняли, что такое декомпозиция.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 20:34
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Однако используется же. В основном как раз для эмуляции исключений и корректного освобождения ресурсов в глобальном масштабе.


Если бы код CLI забит переходами из if-а в else.


if(...)
{
   ...
   if(...) goto xxx;
   ...
}
else
{
   ...
xxx:
   ...
}



И это не еденичные случаи, а закономерность.

AS> А это не семечки, такая система (написанная хорошо) не снижает, а повышает поддерживаемость/расширяемость.


Вот только ответь, что надежнее использовать обертки которые в деструкторах ресурсы освобождают. Или кородить моря goto?

AS>Про Linux могу сказать, что там во многих местах goto использован для повышения эффективности. В таких критичных местах, как планировщик, не станешь заморачиваться с лишними переменными/проверками/функциями, когда можно сделать то, что нужно, напрямик и без потерь.


Во блин! Эффективность на goto! Линукс это давно тормозная и разжиревшая ОС ни чем не отличающаяся от NT. А современные оптимизирующие компиляторы к котрым смело можно причислить VC (которым пользуется MS) и gcc (которым пользуются Линуксойды) оптимизируют в ноль весь оверхэд создаваемый ОО-обертками и лишние if уберают. От ваших вложеных циклов зачастую вообще кмня на камне не остается.


S>>А насчет ATL — я ж говорю, там в основном либо C, либо легаси код, перенесенный из того же С, который просто обломались переписать. Либо все-таки bad habits/недоделанность.


AS>Скорее не из C, а из "старого C++", который мало что умел и поддерживал.


Он деструкторы поддерживал. А этого более чем достаточно для очиски ресурсов.

AS>Тем не менее, и у MS есть разные ситуации. Так, в MFC goto зачастую используется для выхода из вложенных циклов, которые бегают по картам сообщений (CWnd::OnWndMsg, CWinThread::DispatchThreadMessageEx и т. д.).


Вот по этму мне всегда больше нравились карты сообщений ATL. Они и более гибки и goto нам нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 21:11
Оценка:
Здравствуйте DNS, Вы писали:

DNS>
DNS>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3;)
DNS>{
DNS>  for(;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
DNS>  {

DNS>[skip]

DNS>


VD>>Да в твоем случае дейсвтительно лишние извраты.


DNS>Сижу, читаю нитку...

DNS>Влад, что-то вы уже перемудрили, как раз эти 2 for-а и норовят запутать читающего, т.к.
DNS>не являются стандартным подходом к организации циклов. В первом отсутствует модификация,
DNS>во втором инициализация....

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


Если учесь то, что в первом случае for переносился на три строки. То этот точно читабельнее. Главное, что здесь логика структурная и ее на автомате даже анять мтожно. Ну, а для общегчения чтения кода нужно, например, вместо копирования указателей поспользоваться итераторами. Тода было бы нечто вроде:

for(SomeList::Iter i(arySome); i;)
{
if(SomeError)
{
CorrectError();
i.Reset();
continue;
}
...
}

И все, и никаких вложенных циклов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 21:19
Оценка:
Здравствуйте Patalog, Вы писали:

P>Ну, представь себе такую ситуацию.

P>Есть некий прибор, управляется ета хрень какой-нибудь двушкой в железном ящичке под голым досом. Энтих приборчиков энное количество по всему миру (например в Нижнезадрюпенской области, городе Мухосраннске).
P>Maintenance с точки зрения новых красивых фенечек ненужен\невозможен по двум причинам — как ты представляешь обновление софта в этой ситуации? И, второе, железо (приборчик) рабоает на пределе, и новых фенечек из него не высосешь. Да и не нужны они, себестоимость тоже нужно учитывать.

Ну, а как ошибочка в тоем замечательном монолите? А ты ркутой goto-шник на goto-зил и свалил в другую контору. Что делать тем беднягам которым приказано исправить ошибку и выложить в Inet патч?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 04.06.02 21:34
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>А пока — согласен — давай сосредоточимся на C++. Для начала обратимся к теме, которая стоит в сабже. В первом письме я подробно остановился именно на ней. Итак, каким образом поставленная задача решается на C++ лучше, чем с использованием goto?


Это зависит. Я бы хотел видеть код всей процедуры, а не выжимку, которую предоставил LeonGorbachev. Здесь уже давали советы. Я, в зависимости от ситуации, воспользовался бы следующим:

1. Флаг в первом цикле
2. Проверка счётчика второго цикла на завершённость
3. return
4. inline процедура (очень специфический вариант, но возможный)

Скорее всего я бы не задумываясь воспользовался первым вариантом, т.к. у меня это уже в моих личных паттернах, под коркой мозжечка :), но goto я бы использовать не стал.
2-й вариант я бы вряд ли стал использовать сейчас, хотя рашьше мог. Во-первых, нужно счётчик выносить из for, во-вторых, это затрудняет понимание программы.

IT>>Ну вот опять. Плохо уже то, что он вообще эти проблемы пораждает.


AS>Проблемы может порождать всё, что угодно. То же ООП — пачками. Я насмотрелся на пограммы, которые люди пишут в рамках концепции doc/view, которую предлагает MFC. Ей богу, уж лучше бы они свалили весь код в один класс. Именно поэтому в нашей профессии кадры решают почти всё. Эта глобальная проблема, которую не обойти запретами каких-то языковых средств. Просто если человек ламер, он повиснет на проекте тяжёлой гирей, а если нет — будет тянуть его вверх. И твои запреты вряд ли смогут сильно изменить ситуацию.


Всё это несомненно и правильно, но goto только усугубит дело. Возможно, просто получилось так, что ты видел много хорошего, старого, добротного кода с использованием goto и много плохого, "современного" и, который долго не проживёт, так как вообще не имеет право на жизнь, с doc/view. Мне приходилось видеть первый, но с качеством второго. Люди сползали с EC-ок, с PL/1 и Фортрана и начинали писать на процедурных языках. :wow: Поверь мне, doc/view, который ты видел — это детский сад по сравнению с теми уродцами, которые выходили из под пера тех программеров. Так же по старинке они печатали свои километровые процедуры, раскладывали их на полу и бродили по ним в поисках меток, которые имеют тенденцию со временем отдаляться от мест их прямого использования. Никакие уговоры не помогали. И мой шеф, мудрый человек, принял решение предать goto анафеме, запретить под угрозой лешения премии. Подействовало. И ты знаешь что самое прикольное? Размер процедур стал уменьшаться, появились элементы декомпозиции, в распечатках необходимость отпала и всё такое.

AS>>>Я и сам могу. Вопрос, будет ли твой вариант более читабельным. Думаю, что совсем не обязательно.


IT>>Естественно, цепочки if'ов тоже не лучший пример читабельности, но они вполне нормально заменяют технику, показанную тобой.


AS>Я скажу больше: они хуже, так как затрудняют и понимание, и расширяемость. Ты сам заметил, что метод с goto сильно напоминает эмуляцию деструкторов, которые и являются наилучшим решением данной задачи. Если в функцию добавляется ещё один ресурс, при моём подходе достаточно:

AS>- добавить его в секцию переменных
AS>- добавить код очистки в конец
AS>- работать с ресурсом как ни в чём не бывало.

AS>Логика же вложенных if-ов при таком добавлении может полностью измениться. Вот это-то как раз и плохо.


Мои аргументы.
— я никогда не перепутаю порядок освобождения ресурсов, если он важен,
— я могу работать с ресурсами локально, в определённой точке программы и не держать их долго без надобности, особенно при наличии длинных циклов,
— я могу использовать их в тех же циклах, открывая и закрывая их при каждой итерации,
— я могу использовать return более гибко, в том числе и для сабжа, что в твоём случае невозможно, т.к. программа обязательно должно доползти до конца... хотя ты можешь, конечно, использовать ещё один goto ;)
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 22:19
Оценка:
Здравствуйте George_Seryakov, Вы писали:

VD>>Мне до их прдах дела нет. Думаю визио продается куда лучше, что же теперь мне продукты по рейтингу продаж выбирать?


GS>Да. Поглядывать. Соберут они денег на сделать следующую версию или нет. Вот Микрософь собрал денег на сделать NT, а IBM слил воду.


Знаешь. В те времена MS еще не было таким страшным. Я их прекрасно помню. Но я тогда 95-ые как раз принял не из-за денег. Они тогда действительно больше подходили к обстановке. И сделаны были лучше (хоть и архитектурно проигрывали), т.е. куча драйверов, отличная совместимость с 3.1-ми.

GS>Продукт будет развиваться в расчете на текущих пользователей, а они — игруны, не проектировщики.


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

VD>>Там ного чего есть. Там например есть нечто очень похожее на дизайнер тех самые конечных автоматов (забыл как называется).


GS>Диаграмма взаимодействий. Которая на самом деле SDT и диаграмма Хоара одновременно.


Ну, так вот кривая она. У того маньяка со свичь-технологиями и то идейно все более продуманно. Для меня Роза — это как BPWin, рисовашка одно слово.

GS>Ну. Так главное — проектировать, а генерировать можно и врукопашную.


И проектировать можно врукопашную. Мне вот кодеров не хватает.

GS>А вот сейчас тебе и скажут, что ты, значит, и не проектируешь.


Да мне по барабану, кто что скажет. Я знаю чем я занимаюсь и знаю, что пока не видел приемлемого (для меня) продукта позволяющего ускорить процесс.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 04.06.02 22:28
Оценка:
Здравствуйте VladD2, Вы писали:

GS>>Да. Поглядывать. Соберут они денег на сделать следующую версию или нет. Вот Микрософь собрал денег на сделать NT, а IBM слил воду.


VD>Знаешь. В те времена MS еще не было таким страшным. Я их прекрасно помню.


Кул. А ворд микрософтовский под дос?

VD>Но я тогда 95-ые как раз принял не из-за денег.


Я, вобще-то про 3.1 говорил.

VD>Они тогда действительно больше подходили к обстановке. И сделаны были лучше (хоть и архитектурно проигрывали), т.е. куча драйверов, отличная совместимость с 3.1-ми.


Сделано на бабки от 3.1. И получены бабки на NT. Ну, или не бабки, а крелит доверия опльзователей, или доля рынка.

VD>Ну, так вот кривая она. У того маньяка со свичь-технологиями и то идейно все более продуманно. Для меня Роза — это как BPWin, рисовашка одно слово.


Именно так, рисовашка, поддерживающая целостность некоей нотации. А ты что хотел — автоматическую кодогенерацию? Это только через goto работает.
GS
Re[24]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 22:38
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Кул. А ворд микрософтовский под дос?


А что ворд. Для него в те годы даже Лексикон и том конкурентом был. Я уже не говорю про разные Перфекты.

VD>>Но я тогда 95-ые как раз принял не из-за денег.


GS>Я, вобще-то про 3.1 говорил.


Дык полуось все же с 95-ми боролась. 3.1 в нее встроены были. Это же их общий продукт был.

GS>Сделано на бабки от 3.1. И получены бабки на NT. Ну, или не бабки, а крелит доверия опльзователей, или доля рынка.


Если бы все это глюкало меньше, я бы скзал, ну и замечательно.

GS>Именно так, рисовашка, поддерживающая целостность некоей нотации. А ты что хотел — автоматическую кодогенерацию? Это только через goto работает.


Ну, зачем же так?

Я бы хотел занчительно более простую вещь. Визуальный моделлер который выдавалбы в реальном времени котовые программы. И лучше бы вообще без программирования.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 04.06.02 22:44
Оценка:
Здравствуйте VladD2, Вы писали:

GS>>Сделано на бабки от 3.1. И получены бабки на NT. Ну, или не бабки, а кредит доверия пользователей, или доля рынка.


VD>Если бы все это глюкало меньше, я бы скзал, ну и замечательно.


Пипл хавает. Нет, даже так: ПИПЛ ХАВАЕТ! Уж ты-то должен это понимать.

GS>>Именно так, рисовашка, поддерживающая целостность некоей нотации. А ты что хотел — автоматическую кодогенерацию? Это только через goto работает.


VD>Ну, зачем же так?


VD>Я бы хотел занчительно более простую вещь. Визуальный моделлер который выдавалбы в реальном времени котовые программы. И лучше бы вообще без программирования.


Тогда жди.
GS
Re[26]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 22:49
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Пипл хавает. Нет, даже так: ПИПЛ ХАВАЕТ! Уж ты-то должен это понимать.


Дык. Сами и хаваем. Но всегда хочется чего нибудь большого и пушистого.

VD>>Я бы хотел занчительно более простую вещь. Визуальный моделлер который выдавалбы в реальном времени котовые программы. И лучше бы вообще без программирования.


GS>Тогда жди.


Похоже проще самому сдалть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 22:57
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>IT хотел сказать, что если оформить goto как-то так:

DG>

DG>BEGIN_LOOP(A)(;;)
DG>  BEGIN_LOOP(B)(int i = 0; i < 100; i++)
DG>    if(i == 77)
DG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
DG>      BREAK_LOOP(A);
DG>  END_LOOP(B)
DG>END_LOOP(A)

DG>то читаться это будет намного лучше (даже человеком, который не знает реализацию данных макросов)


DG>#define BEGIN_LOOP(a) for
DG>#define END_LOOP(a) loop_##a:
DG>#define BREAK_LOOP(a) goto loop_##a

DG>


Вот и верь потом в скзки про вердность макросов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 04.06.02 22:57
Оценка:
Здравствуйте VladD2, Вы писали:

VD>>>Я бы хотел занчительно более простую вещь. Визуальный моделлер который выдавалбы в реальном времени котовые программы. И лучше бы вообще без программирования.


GS>>Тогда жди.


VD>Похоже проще самому сдалть.


Давай делать. Нотацию какую будем поддерживать? UML? Генерировать скелет или сразу весь код придется мышкой вазюкать?

В принципе, есть перекос, в который можно пропихнуть лапу: привязка моделирования и кодогенерации к библиотекам кода и готовых решений. Типа — разбираем рукописное приложение на образцы, и моделируем из этих образцов. Это может дать весьма высокую готовность нагенеренного кода. Ключевым тут является модель хранения кода, моделей и их провязки.
GS
Re[16]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.06.02 23:04
Оценка:
Здравствуйте DarkGray, Вы писали:

AS>>>>Не очень понятно, к чему всё это. Можно конкретный пример?


IT>>>Я к тому, что даже в приведённом тобой для C случая люди пытаются боряться с goto применением всевозможных сил и средств, например, макросов примерно так:


AS>>Всё равно не понятно. Что с того, что кто-то так делает? Я, например, встречал такие конструкции редко. И там где встречал, матерился, так как приходилось разбираться, что стоит за этими макросами, и потом держать это в голове.


DG>IT хотел сказать, что если оформить goto как-то так:



Еще менее напряжный код, как для пищущего программиста, так и для читающего (но зато более напряжный на оптимизатор):

naming_for(A)(;;)
{
  for(int i = 0; i < 100; i++)
  {
    if(i == 77)
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
      break_naming_for(A);
  }
}


#define break_naming_for(a) is_run_naming_for_##a = false; goto naming_for_label_##a;

#define naming_for(a) bool is_run_naming_for_##a = true; naming_for_label_##a:; if (is_run_naming_for_##a) for

//всю гадость выкинет оптимизатор, а читабельность останется
Re[28]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.06.02 23:05
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Давай делать. Нотацию какую будем поддерживать? UML? Генерировать скелет или сразу весь код придется мышкой вазюкать?


GS>В принципе, есть перекос, в который можно пропихнуть лапу: привязка моделирования и кодогенерации к библиотекам кода и готовых решений. Типа — разбираем рукописное приложение на образцы, и моделируем из этих образцов. Это может дать весьма высокую готовность нагенеренного кода. Ключевым тут является модель хранения кода, моделей и их провязки.


Мне не нравится сама концепция генерации кода. Я себе это вижу так:

1. Есть некая прикладная область. Не узкая, не широкая, а в самый раз.
2. Есть некая компонентная модель. Расширяемая теми самыми технологиями где ручками нужно кодить.
3. Есть некий конструктор-моделлер, который позволяет описывать проблемы этой предметной области в виде диаграмм структур данных.
4. Есть встроенные средства позволяющие создавать GUI для этих моделей (опять же без программирования).
5. Есть возможность подключать модули (компоненты) написанные на обычных языках..
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 04.06.02 23:16
Оценка:
Здравствуйте VladD2, Вы писали:

VD>1. Есть некая прикладная область. Не узкая, не широкая, а в самый раз.

VD>2. Есть некая компонентная модель. Расширяемая теми самыми технологиями где ручками нужно кодить.
VD>3. Есть некий конструктор-моделлер, который позволяет описывать проблемы этой предметной области в виде диаграмм структур данных.
VD>4. Есть встроенные средства позволяющие создавать GUI для этих моделей (опять же без программирования).
VD>5. Есть возможность подключать модули (компоненты) написанные на обычных языках..

Автоматизация программирования для предметной области. Мне такое не интересно. Хотя коммерчески может быть весьма успешным: САПР Бухгалтерия! САПР Отчеты по бухгалтерии! САПР Отчеты в налоговую! САПР Левая бухгалтерия! САПР Кадры! САПР Крупный банк! САПР Мелкий банк! и т.д. и т.п., и за все бабки.

И куда только вся эта тьма наглюканых бухгалтерий потом деваться будет?
GS
Re[3]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 05.06.02 00:40
Оценка:
Здравствуйте Patalog, Вы писали:

P>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


Кстати, даже добавление break (не говоря уж о goto) к структурному программированию портит всю теоретическую картину — рушится весь конструктивизм и многие теоремы существования. Кстати, многие неудобные места в современных языках программирования — это просто следствия из неправильного теоретического проектирования языка.

P>ЗЫж Не флейма окаянного ради, может я и правда чего не знаю/понимаю?


Для детального анализа нужна мат. логика и обобщенная теория моделей вкупе с теорией категорий.
Re[8]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 05.06.02 00:44
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Повторюь еще раз. goto не структурированный оператор. И его ипользование вност хаотичность в код.


Про схемы Янова слышал? Посмотри — потом будешь говорить насчет неструктурированности. Все зависит от контекста.

VD>У нас в конторе написано ~ 300 000 рабочего кода (не считая кода к статьям) на C++ и goto не разу не применялся. Один программист как то раз начал отстаивать точку зрения "что в его случае лучше применить goto" и рьяно так... но когда мы переписали его код, он и сам согласился, что так элегантнее, понятее и безопаснее.


Единственное условие применения структурных конструкций — "правило отсутствия неожиданностей". Если применение goto удовлетворяет этому принципу — оно и элегантно, и понятно, и безопасно.
Re[16]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 04:44
Оценка:
Здравствуйте IT, Вы писали:

Пардон, вмешаюсь...

IT>Мои аргументы.

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

Странные у тебя аргументы. То ты говоришь о некоем абстрактном горе-программисте, которому ни в коем случае нельзя давать в руки страшное оружие goto. И тут же приводишь в пример себя любимого, дескать "я никогда не перепутаю порядок освобождения ресурсов, если он важен" и далее по тексту. А что мешает этому абстрактному программисту перепутаь?

И еще, касательно 3-го пункта "аргументов": А ежели этот самый ресурс, который ты будешь открывать и закрывать в каждой итерации сильно долго открывается\закрывается?
Почетный кавалер ордена Совка.
Re[6]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 04:49
Оценка:
Здравствуйте flyker, Вы писали:

[skip]

F>
F>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
F>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
F>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
F>       if(nRes != CCB_ERR_NOERROR) {
F>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
F>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
F>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
F>            nErrorCount++;
F>            
F>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
F>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
F>            else
F>            {
F>                pRecord3 = pRecord1->m_pFirstRecord; //Юзер попытался исправить ошибку, надо проверить заново
F>                continue;
F>             }
F>       }
F>   }
F>}
F>


F>Я бы так написал, а как другие пишут мне глубоко по барабану, лишь бы не мне читать и править.

F>Но в данном конкретном случае оба варианта имеют право на жизнь.
F>Хотя если бы не комментарий в ключевой строке, дольше бы понимал суть.

Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.
А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?
Почетный кавалер ордена Совка.
Re[4]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 04:52
Оценка:
Здравствуйте m.a.g., Вы писали:

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


P>>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


...>Кстати, даже добавление break (не говоря уж о goto) к структурному программированию портит всю теоретическую картину — рушится весь конструктивизм и многие теоремы существования. Кстати, многие неудобные места в современных языках программирования — это просто следствия из неправильного теоретического проектирования языка.


Мсье теоретик? Объясните популярно, что есть "рушится весь конструктивизм и многие теоремы существования"?
И как эту задачу решить с точки зрения "правильного теоретического проектирования".
Почетный кавалер ордена Совка.
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 04:59
Оценка:
Здравствуйте The Lex, Вы писали:

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


[skip]
TL>Вот так вот и представляешь себе обновление софта. И добавление фенечек и рюшечек. И управление всей сетью. И еще много чего. И приборчик работает на пределе. И новые фенечки из него высасывать надо, потому что с рынка улетишь в два счета — конкуренты не дремлют. А приходит новая "железячка": старый софт выбрасывать, да? Вот IT (если я ничего не перепутал) работал в этой сфере — он может подтвердить.

TL>Так что и этот пример, увы, надуман...


Это что, как в нотах некоего Ференса Листа? На одной странице — играть быстро, на 2-й еще быстрее, 3-й быстро как только возможно, и все же на 4-й — еще быстрее. И ежели железо работает на пределе это значит оно работает на пределе. И новых фенечек из него _не_ вытащить. А чтобы не улететь с рынка, нужно делать более другое железо, под которое нужен более другой софт. Т.е. принципы управления и алгоритмы работы железки изменились _полностью_.

А я сейчас работаю в подобной сфере, и что?
Почетный кавалер ордена Совка.
Re[11]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 05.06.02 05:09
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте The Lex, Вы писали:


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


P>[skip]

TL>>Вот так вот и представляешь себе обновление софта. И добавление фенечек и рюшечек. И управление всей сетью. И еще много чего. И приборчик работает на пределе. И новые фенечки из него высасывать надо, потому что с рынка улетишь в два счета — конкуренты не дремлют. А приходит новая "железячка": старый софт выбрасывать, да? Вот IT (если я ничего не перепутал) работал в этой сфере — он может подтвердить.

TL>>Так что и этот пример, увы, надуман...


P>Это что, как в нотах некоего Ференса Листа? На одной странице — играть быстро, на 2-й еще быстрее, 3-й быстро как только возможно, и все же на 4-й — еще быстрее. И ежели железо работает на пределе это значит оно работает на пределе. И новых фенечек из него _не_ вытащить. А чтобы не улететь с рынка, нужно делать более другое железо, под которое нужен более другой софт. Т.е. принципы управления и алгоритмы работы железки изменились _полностью_.


А те кто делают новое железо, разумеется, выбрасывают на ветер свои инвестиции, каждый раз разрабатывая новые, _полностью_ измененные принципы управления и алгоритмы работы железки?

P>А я сейчас работаю в подобной сфере, и что?


В какой именно, если это, конечно же, не слишком большой секрет?
Голь на выдумку хитра, однако...
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 05:11
Оценка:
Здравствуйте VladD2, Вы писали:

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


P>>Ну, представь себе такую ситуацию.

P>>Есть некий прибор, управляется ета хрень какой-нибудь двушкой в железном ящичке под голым досом. Энтих приборчиков энное количество по всему миру (например в Нижнезадрюпенской области, городе Мухосраннске).
P>>Maintenance с точки зрения новых красивых фенечек ненужен\невозможен по двум причинам — как ты представляешь обновление софта в этой ситуации? И, второе, железо (приборчик) рабоает на пределе, и новых фенечек из него не высосешь. Да и не нужны они, себестоимость тоже нужно учитывать.

VD>Ну, а как ошибочка в тоем замечательном монолите? А ты ркутой goto-шник на goto-зил и свалил в другую контору. Что делать тем беднягам которым приказано исправить ошибку и выложить в Inet патч?


Какой такой Inet в городе Мухосранске? Мсье не допонял исходную посылку. И какая такая ошибка, если монолдит замечательный?
Ежели в моем "замечательном монолите" будет критическая ошибка меня и так уволят И не только меня. А если на этапе эксплуатации обнаружится не критическая ошибка, то баги перековываются в фичи

ЗЫж Что будут делать те "бедняги" меня нисколько не волнует, ибо в человеколюбии замечен не был. Да и самому не раз приходилось оказываться в такой ситуации. Хотя все зависит от ситуации.
ЗЗЫж Вот я и говорю, после ваших ответов у меня складывается впечатление, что все ето замечательное "граммотное структурное программирование" нужно людям дабы править баги после релиза. А не проще то время, которое нужно чтобы каждый чих обернуть в "объектную обертку" (sorry за тафтологию), пытаться вместо одного goto городить кучу if'ов\флагов\и т.д. потратить на то чтбы просто нормально написать\отладить.
Почетный кавалер ордена Совка.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 05:57
Оценка:
Здравствуйте IT, Вы писали:

[skip]

IT>Ну давай устроим голосование про что такое программирование и все дружно проголосуем за то, что это искусство. Правда само оно от этого не перестанет быть производством. Высокотехнологичным, наукоёмким, но производством, я бы даже сказал — местами ремеслом.


Я — за :super:

[skip]

IT>Не приходило. Более того, пока ты пишешь программу ты её сам и изменяшь. Или ты никогда не возвращаешься к уже написанному коду? Типа открыл тетрадку начал писать, закончилась тетрадка пошёл сдал результат заказчику? Ну-ну.


Возвращаюсь. И повторю еще раз, тот кусок кода, который прислал Vlad для меня более непонятен, не говоря о более других недостатках :)

[skip]

IT>Не важно подо что пишется софт, под железо или под юзера. Завтра ты получаешь новую версию железа и что, будешь писать под неё софт с нуля или доработаешь предыдущую версию программы? Если она монолитная и неизменяемая и не позволяет добавить пару новых фич, то наверное первое. Дорогой ты получается разработчик для своего работодателя. Тебе бы за эту переделку заплатить как за доработку, а не новую разработку, сразу бы всё стало понятно.


Важно. А "новая версия желаза" она бывает разная, одно дело другой контроллер той же серии (поболее памяти, регистров, побыстрее), а другое дело совершенно _другой_ контроллер. С другой логикой, системой комманд и т.д. Хотя я непосредственно контроллеры не программирую, но интерфейс к железке в целом может кардинально измениться. А насчет "дорогойразработчик" — не к этому ли стремимся? ;) И платят мне именно за доработку.

P>>А maintenance, как ты выразился, в большинстве софтверных контор вырождается в убирание багов уже после релиза.


IT>Правильно. Полтора года назад сидел я одном доткоме и правил баги. Первое с чего всё начиналось — это с преведения исходного кода в божеский вид, расстановки отступов, добавления пробельных строк между процедурами и т.д. На это уходило больше времени чем на исправление самих багов. Этот дотком платил за меня моему работодателю 80 баксов в час, $640/день, $3200/неделю, $14000/месяц. Половиной этих денег оплачивалось форматирование исходных кодов. После того как пара таких самородков, за которыми всё время приходилось убирать ушли, было принято Code Convention и дело пошло на лад. Правда самому доткому уже не долго оставалось жить.


Я рад за тебя. У меня например, много работы уходит именно на то, чтобы разобраться в метрах Open Sorce и переделать это под свои нужды. Мне столько не платят :( А бывает и вообще, неделями из hex-editor'а не вылазишь.

IT>>>Это всё важно, но вторично.


P>>Еще раз повторюсь, есть вещи в которых _ЭТО_ первично. А вот модное слово maintenance вторично, либо совсем не нужно.


IT>Ты говоришь как типичный одиночка, никогда не работавший в команде, тем более в большой. Мне вот и сейчас приходится проводить работу с молодыми и втолковывать им, мол ребята, расслабьтесь, если ты работаешь в команде и на дядю, то твой код тебе не принадлежит. Он пренадлежит команде и дяде. Открывай свою контору и хоть оппишись goto, можешь нанять программистов и заставить их тоже так писать, флаг в руки. А ещё потребуй от них чтобы они тебе наколбасили кода, который бы невозможно было понять другому человеку и повторно использовать. А если они не дай бог вздумают своевольничать и писать универсальные классы и процедуры, да ещё и без goto, то всех лешить премии и уволить.


Может быть. Скорее даже так и есть. Ибо у нас в конторе (cool site) 3 программера, остальные железячники. И пректы наши хоть и пересекаются, но в весьма узких местах. Насчет невозможно понять я уже писал выше, это же отмечал и Alexander Shargin и не только он. В том смысле что гора if'ов\циклов\флагов нисколько не читабельнее, и еще непонятнее. А универсальные классы и процедуры и я пишу, не надо доводить дело до абсурда, о чем я (да и не только я) тоже неоднократно говорил. И Буча я читал, и Брукса и иже с ними. И розу юзал. Если ты еще не понял мою мысль повторю: Использовать goto _иногда_ не только можно, но и нужно.

IT>ЗЫ. Знаешь почему на RSDN'е так медленно появляются новые фичи? В том числе и потому, что если мне нужно что-то добавить в исходнике, с которым мне не приходилось ещё работать, то для начала я должен его переписать по новой. При этом я уважаю Диму, который всё это делал, как талантливого программиста, но была бы моя воля я бы отшлёпал это юное дарование за то, что он видимо как и ты считает maintenance просто модным словом и оно для него "вторично, либо совсем не нужно".


Еще раз. Не надо сравнивать, я извиняюсь, хрен с пальцем. Одно дело RSDN с его новыми фичами, а другое дело "РЧА Аблатор проводящих путей сердца". И даже если мне _сильно_ захочется добавить новую фенечку, мне это _никто_ не даст, ибо придется все сертифицировать заново (не буду сейчас рассказывать, что значить получать ГОСТ на мед. технику), переделывать гору документации, а возможно даже и методики применения\воздействия на которых не один врач защитил докторскую диссертацию. Когда количество нужных "фенечек" приближеатся к некоему пределу, выпускается новый, более другой прибор. С более другим софтом. И старый по большей части используется для метода Copy\Paste.

ЗЫж Помниться я в одном из ответов Vlad'у срошивал All — какие у кого корпоративные правила кодирования. Ибо мне это действительно интересно, и я прекрасно знаю, что с о своим уставом, в чужой монастырь вредно для здоровья. Может все таки поговорим об этом?

ЗЗЫж У нас был один менеджер, который пытался уволить одного как ты выразился одиночку (не меня), дело закончилось тем что выгнали менеджера. И, имхо, это правильно.
Почетный кавалер ордена Совка.
Re[12]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 06:03
Оценка:
Здравствуйте The Lex, Вы писали:

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


P>>Здравствуйте The Lex, Вы писали:


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


P>>[skip]

TL>>>Вот так вот и представляешь себе обновление софта. И добавление фенечек и рюшечек. И управление всей сетью. И еще много чего. И приборчик работает на пределе. И новые фенечки из него высасывать надо, потому что с рынка улетишь в два счета — конкуренты не дремлют. А приходит новая "железячка": старый софт выбрасывать, да? Вот IT (если я ничего не перепутал) работал в этой сфере — он может подтвердить.

TL>>>Так что и этот пример, увы, надуман...


P>>Это что, как в нотах некоего Ференса Листа? На одной странице — играть быстро, на 2-й еще быстрее, 3-й быстро как только возможно, и все же на 4-й — еще быстрее. И ежели железо работает на пределе это значит оно работает на пределе. И новых фенечек из него _не_ вытащить. А чтобы не улететь с рынка, нужно делать более другое железо, под которое нужен более другой софт. Т.е. принципы управления и алгоритмы работы железки изменились _полностью_.


TL>А те кто делают новое железо, разумеется, выбрасывают на ветер свои инвестиции, каждый раз разрабатывая новые, _полностью_ измененные принципы управления и алгоритмы работы железки?


Я новое железо не делаю, поэтому принимаю как данное. Ибо не железячник. Вопрос не ко мне. Видимо всетаки есть причини, имхо.

P>>А я сейчас работаю в подобной сфере, и что?


TL>В какой именно, если это, конечно же, не слишком большой секрет?


Не секрет. cool site
Почетный кавалер ордена Совка.
Re[13]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 05.06.02 06:36
Оценка:
Здравствуйте VladD2, Вы писали:

AS>>>Во-первых, мне не совсем понятно, почему для противники goto постоянно щеголяют приёмами из арсенала C++. Если goto противоречит принципам структурного программирования, давайте оперировать средствами языка C. То есть никаких исключений, объектных обёрток и пр.


S>>Не, это не честно. Неиспользование goto в C — это уже совсем другой вопрос. Я думаю, экстремистов, утверждающих, что goto не нужен в С куда меньше, чем протестующих против его использования в C++.


VD>Дык, одной из задач при разработке C++ было избавление от вынужденного использования неструктурированноых goto. Кстати, в тот же С структурную обработку иключений ввели и даже лучше чем в С++. А мы всю жизнь COM-объекты на ATL делали без нее и ничего. Ни одного goto в коде и все работает.


Да при чем тут COM-объекты. Оно (goto) реально в основном во всяких вычислительных алгоритмах нужно. Для выхода из вложенных циклов, не более того.

AS>>>Кстати, в Java goto убрали, но расширили синтаксис break для выхода из вложенных циклов. Похоже, ребята рассуждали похожим образом.


S>>И правильно сделали. А комитет по стандартизации C++ правильно делает, что goto не убирает. Хотя break усовершенствовать не помешало бы —


VD>Согласен.


S>>глядишь, goto только в legacy коде и остался бы.


VD>А вот тут нет. Посмотри на голосование. 100%-ых противников goto 5 человек (тебя я там не вдел ;), а сторонников довольно моного).


А я за goto, потому что пока break в С++ недостаточно функциональный. Вот сделают break такой же, как в жабе — проголосую против goto :)

VD>Еще больше удручает C++-ый код того же MS. Там порою встречается идеальный и красивый код, а иногда вот такие прерлы:


VD>
   код поскипан.
VD>


Ну про такой код что говорить — типичный пример сишного стиля в С++ коде. Либо писал человек, которого Страус так и не убедил, что С++ — савсэм другой язык, нежели С, либо это легаси и переписывать некогда/незачем было.

S>>Вот именно! Функция должна выполнять логически завершенное действие, а не служить заменой циклу. Уж лучше goto.


VD>Лучше код разумно писать, тогда и нагромождения циклов не будет. Да и никто не мешает на обычных ифах жить. Все равно оптимизатор все переделает так, что мама родная не узнает.


А у нас в конторе оптимизатор запрещен, как у некоторых goto :). А без нагромождения циклов иногда не обойдешся.

VD>Кстати если посчитать количесвто goto в ATL, то окажется, что там их совесем не много и используется они приимущественно в целях обработки ошибок (VC6 реализовывал try/catch на CRT, от которого ATL-щики избавлялись). Ну, а в WTL вообще нельзя найти ни одного goto (хотя и там ламеры были). У на 5 мегов кода и ни одного goto и ничего живем и все работает.


Ну, в ATL я бы в худшем случае 2 goto оставил, не пользуясь исключениями. Для той обработки ошибок, что там нужна, вполне достаточно объектных оберток и return. А если б мне еще и CRegParser пришлсь переписать, то вероятно, что и вовсе не одного.

AS>>>В-третьих, любители жить без CRT тоже не очень-то жалуют исключения (и ATL/WTL вполне поддерживают такой стиль жизни).


VD>Ну, вот мы как раз такие любители, ну, и что? Ни одного goto нет и CRL не ципляем. И вообще ресурсы в ручную не выделяем все на обертках.


S>>А без CRT — это уже не С++, а "С с классами", да и то урезанный.


VD>Ну, тут ты не прав. Для C++ под Виндовс CRT ненужна. Мы вон сделали 10 оберток над API-шными функциями и все прекрасно работает. Даже STL-ю по большому счету CRT не нужен (хотя мне STL не нравится).


А исключения (для того же STL нужны, кстати)? А конструкция/деструкция глобальных объектов (я слышал, в семерке для это рантайм не нужен, но у меня )? Строки/локали STLные тоже за собой рантайм тянут. А плавающая точка? К четырем прибавть два, конечно, и без CRT можно, но вот чтоб юзеру результат показать — уже хотя бы printf нужен.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[7]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 05.06.02 07:53
Оценка:
Здравствуйте Patalog, Вы писали:

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


P>[skip]


F>>
F>>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
F>>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
F>>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
F>>       if(nRes != CCB_ERR_NOERROR) {
F>>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
F>>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
F>>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
F>>            nErrorCount++;
F>>            
F>>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
F>>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
F>>            else
F>>            {
F>>                pRecord3 = pRecord1->m_pFirstRecord; //Юзер попытался исправить ошибку, надо проверить заново
F>>                continue;
F>>             }
F>>       }
F>>   }
F>>}
F>>


F>>Я бы так написал, а как другие пишут мне глубоко по барабану, лишь бы не мне читать и править.

F>>Но в данном конкретном случае оба варианта имеют право на жизнь.
F>>Хотя если бы не комментарий в ключевой строке, дольше бы понимал суть.

P>Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.

P>А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?

Ну ну, ты еще скажи что код не эквивалентен оригиналу.
Все гениальное — просто
Re: Выйти из двух циклов сразу
От: Whisperer  
Дата: 05.06.02 07:54
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


Ау знатоки программирования может вы другие темы смотреть будете и помогать желающим, а
вы обсасываете старую избитую тему (вчем прикол — поговорить, для этого chat существует).
Я смотру если появляется хороший вопрос — ответов или 0 или <10 . Зато на такие темы вы кидаетсесь
как голодные ... (извеняюсь вырвалось). И необежайтесь если я неправ. Мне здесь тоже помогали.
Но активность — только из-за таких тем.
Re[13]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 05.06.02 08:01
Оценка:
Здравствуйте VladD2, Вы писали:


VD>Дык, одной из задач при разработке C++ было избавление от вынужденного использования неструктурированноых goto. Кстати, в тот же С структурную обработку иключений ввели и даже лучше чем в С++. А мы всю жизнь COM-объекты на ATL делали без нее и ничего. Ни одного goto в коде и все работает.


Это вообще ровным счётом ни о чём не говорит. Я, например, могу все свои программы без while/do/for переписать. И всё будет работать.


AS>>>Резюме. Я призиваю участников этого флейма не быть такими категоричными. Эту ветку могут читать начинающие. Не надо прессовать им мозги "незыблемыми правилами". Лучше поучите их думать головой.


VD>Так вот используя goto головой люди обычно и не думают. По этому я призываю начинающих думать головой и никогда не использовать goto.


Ну, это уже демагогия. Похоже, вам с IT довелось много общаться с людьми, которые переходили на C++ со всяких там фортранов и алголов. А мне, например, нет. Меняются поколения, меняются идеалы. Сейчас программисты с самого начала учатся использовать goto умеренно (во всех нормальных книгах об этом написано). Поэтому твои обобщения на "людей", которые "обычно не думают" — не более чем пустые слова.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[16]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 05.06.02 08:10
Оценка:
Здравствуйте VladD2, Вы писали:

AS>>Однако используется же. В основном как раз для эмуляции исключений и корректного освобождения ресурсов в глобальном масштабе.


VD>Если бы код CLI забит переходами из if-а в else.


В этом месте я говорил о setjmp/longjmp, которые используюся для организации механизма исключений (как это было сделано в ранних версиях MFC, пока C++ не обзавёлся собственными исключениями). При чём тут goto и обёртки?


AS>>Про Linux могу сказать, что там во многих местах goto использован для повышения эффективности. В таких критичных местах, как планировщик, не станешь заморачиваться с лишними переменными/проверками/функциями, когда можно сделать то, что нужно, напрямик и без потерь.


VD>Во блин! Эффективность на goto! Линукс это давно тормозная и разжиревшая ОС ни чем не отличающаяся от NT.


Речь о ядре, а не о Линуксе в целом. На его основе, между прочим, строят системы реального времени. Из Виндоусов на это может претендовать только CE, но и от неё в этом качестве серьёзные фирмы по размышлении зрелом отказались.


VD>А современные оптимизирующие компиляторы к котрым смело можно причислить VC (которым пользуется MS) и gcc (которым пользуются Линуксойды) оптимизируют в ноль весь оверхэд создаваемый ОО-обертками и лишние if уберают. От ваших вложеных циклов зачастую вообще кмня на камне не остается.


Никуда они не денутся. Если вложенный цикл легко убирается, значит он вообще нафиг не нужен в данном алгоритме, и программисту следовало убрать его из программы самому. Если же он действительно нужен, никакой оптимизатор его не уберёт.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 08:26
Оценка:
Здравствуйте flyker, Вы писали:

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


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


P>>[skip]


F>>>
F>>>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
F>>>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
F>>>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
F>>>       if(nRes != CCB_ERR_NOERROR) {
F>>>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
F>>>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
F>>>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
F>>>            nErrorCount++;
F>>>            
F>>>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
F>>>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
F>>>            else
F>>>            {
F>>>                pRecord3 = pRecord1->m_pFirstRecord; //Юзер попытался исправить ошибку, надо проверить заново
F>>>                continue;
F>>>             }
F>>>       }
F>>>   }
F>>>}
F>>>


F>>>Я бы так написал, а как другие пишут мне глубоко по барабану, лишь бы не мне читать и править.

F>>>Но в данном конкретном случае оба варианта имеют право на жизнь.
F>>>Хотя если бы не комментарий в ключевой строке, дольше бы понимал суть.

P>>Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.

P>>А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?

F>Ну ну, ты еще скажи что код не эквивалентен оригиналу.




А что, таки и эквивалентен? В твоей реализации цикл после continue продолжиться не с начала. Т.е. если в первом же проходе возникла ошибка, то после pRecord3 = pRecord1->m_pFirstRecord; цикл будет продослжен с pRecord3 = pRecord3->m_pNextDirectory, т.е. со следующей записи.
Не говоря уже о том, что менять переменную цикла в самом цикле ето, ну, скажем не совсем хорошо. Имхо, много похуже пресловутого goto.

Хинт, посмотри в отладчике:

for(int i = 0; i < 5; i++) {
    if(i == 1) {
        i = 0;
        continue;
    }
}
Почетный кавалер ордена Совка.
Re[16]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 05.06.02 08:38
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Alexander Shargin, Вы писали:


AS>>А пока — согласен — давай сосредоточимся на C++. Для начала обратимся к теме, которая стоит в сабже. В первом письме я подробно остановился именно на ней. Итак, каким образом поставленная задача решается на C++ лучше, чем с использованием goto?


IT>Это зависит. Я бы хотел видеть код всей процедуры, а не выжимку, которую предоставил LeonGorbachev.


Думаю, для начала выжимки будет достаточно. Считай, что у тебя есть вычислительный алгоритм, в котором попался двойной цикл типа

for(int i=0; i<1000; i++)
   for(int j=0; j<1000; j++)
      if(i == 666 && j == 123)
      {
         // выходим
      }



IT>Здесь уже давали советы. Я, в зависимости от ситуации, воспользовался бы следующим:


IT>1. Флаг в первом цикле

IT>2. Проверка счётчика второго цикла на завершённость
IT>3. return
IT>4. inline процедура (очень специфический вариант, но возможный)

Эти советы я уже слышал, но, повторяю, на мой взгляд, эти методы проигрывают подходу с goto:

for(int i=0; i<1000; i++)
   for(int j=0; j<1000; j++)
      if(i == 666 && j == 123)
      {
         goto LEndOfOuterLoop;
      }

LEndOfOuterLoop:



В общем, чтобы не быть голословным, пиши свой вариант и аргументируй, чем он лучше в плане а) эффективности б) понятности и в) поддерживаемости/расширяемости. А я пока подумаю о других примерах. ;)


IT>Всё это несомненно и правильно, но goto только усугубит дело. Возможно, просто получилось так, что ты видел много хорошего, старого, добротного кода с использованием goto и много плохого, "современного" и, который долго не проживёт, так как вообще не имеет право на жизнь, с doc/view. Мне приходилось видеть первый, но с качеством второго. Люди сползали с EC-ок, с PL/1 и Фортрана и начинали писать на процедурных языках. :wow: Поверь мне, doc/view, который ты видел — это детский сад по сравнению с теми уродцами, которые выходили из под пера тех программеров. Так же по старинке они печатали свои километровые процедуры, раскладывали их на полу и бродили по ним в поисках меток, которые имеют тенденцию со временем отдаляться от мест их прямого использования. Никакие уговоры не помогали. И мой шеф, мудрый человек, принял решение предать goto анафеме, запретить под угрозой лешения премии. Подействовало. И ты знаешь что самое прикольное? Размер процедур стал уменьшаться, появились элементы декомпозиции, в распечатках необходимость отпала и всё такое.


Вот здесь мы, похоже, добрались до самых истоков твоей ненависти к goto. Игорь, с этого следовало начинать, это позволило бы обойтись без тонны флейма. Вместо всех этих громких слов о неструктурированности, вреде и норкотиках сказал бы, что в вашей конкретной команде эта мера была вынужденным и, возможно, наиболее эффективным средством повысить качество кода и ускорить разработку. Эта мысль была бы встречена на ура и не вызвала бы никаких нареканий.


IT>>>Естественно, цепочки if'ов тоже не лучший пример читабельности, но они вполне нормально заменяют технику, показанную тобой.


AS>>Я скажу больше: они хуже, так как затрудняют и понимание, и расширяемость. Ты сам заметил, что метод с goto сильно напоминает эмуляцию деструкторов, которые и являются наилучшим решением данной задачи. Если в функцию добавляется ещё один ресурс, при моём подходе достаточно:

AS>>- добавить его в секцию переменных
AS>>- добавить код очистки в конец
AS>>- работать с ресурсом как ни в чём не бывало.

AS>>Логика же вложенных if-ов при таком добавлении может полностью измениться. Вот это-то как раз и плохо.


IT>Мои аргументы.

IT>- я никогда не перепутаю порядок освобождения ресурсов, если он важен,

Я тоже. Не вижу связи. Я не перепутаю, ты не перепутаешь, а кто-нибудь возьмёт и перепутает. :)


IT>- я могу работать с ресурсами локально, в определённой точке программы и не держать их долго без надобности, особенно при наличии длинных циклов,


Мой метод тоже это позволяет. Он ведь работает почти как обёртка: ты можешь ждать деструктора, а можешь вызвать очередной Close/Release/Delete и освободить ресурс в любой момент. Нужно только проверить в конце, не был ли ресурс освобождён (проверка на NULL как раз и служит этой цели).


IT>- я могу использовать их в тех же циклах, открывая и закрывая их при каждой итерации,


См. предыдущй пункт. Мой подход не накладывает на эту тактику никаких ограничений.


IT>- я могу использовать return более гибко, в том числе и для сабжа, что в твоём случае невозможно, т.к. программа обязательно должно доползти до конца... хотя ты можешь, конечно, использовать ещё один goto ;)


В случае с if'ами выход работает так: освобождаем все ресурсы/return. У меня — goto cleanup (всегда одна строчка). Не вижу принципиальной разницы.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[9]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 05.06.02 08:40
Оценка:
Здравствуйте Patalog, Вы писали:

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


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


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


P>>>[skip]


F>>>>
F>>>>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
F>>>>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
F>>>>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
F>>>>       if(nRes != CCB_ERR_NOERROR) {
F>>>>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
F>>>>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
F>>>>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
F>>>>            nErrorCount++;
F>>>>            
F>>>>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
F>>>>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
F>>>>            else
F>>>>            {
F>>>>                pRecord3 = pRecord1->m_pFirstRecord; //Юзер попытался исправить ошибку, надо проверить заново
F>>>>                continue;
F>>>>             }
F>>>>       }
F>>>>   }
F>>>>}
F>>>>


F>>>>Я бы так написал, а как другие пишут мне глубоко по барабану, лишь бы не мне читать и править.

F>>>>Но в данном конкретном случае оба варианта имеют право на жизнь.
F>>>>Хотя если бы не комментарий в ключевой строке, дольше бы понимал суть.

P>>>Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.

P>>>А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?

F>>Ну ну, ты еще скажи что код не эквивалентен оригиналу.


P>


P>А что, таки и эквивалентен? В твоей реализации цикл после continue продолжиться не с начала. Т.е. если в первом же проходе возникла ошибка, то после pRecord3 = pRecord1->m_pFirstRecord; цикл будет продослжен с pRecord3 = pRecord3->m_pNextDirectory, т.е. со следующей записи.

P>Не говоря уже о том, что менять переменную цикла в самом цикле ето, ну, скажем не совсем хорошо. Имхо, много похуже пресловутого goto.

P>Хинт, посмотри в отладчике:


P>
P>for(int i = 0; i < 5; i++) {
P>    if(i == 1) {
P>        i = 0;
P>        continue;
P>    }
P>}
P>




Даже смотреть не буду, я просто знаю что код

for(int i = 0; i < 1; i++) continue;


Это будет ВЕЧНЫЙ цикл. i++ никогда не произойдет.
Все гениальное — просто
Re[10]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 05.06.02 08:43
Оценка:
Здравствуйте flyker, Вы писали:

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


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


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


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


P>>>>[skip]


F>>>>>
F>>>>>for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
F>>>>>   if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) {
F>>>>>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
F>>>>>       if(nRes != CCB_ERR_NOERROR) {
F>>>>>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
F>>>>>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
F>>>>>            nCallBackRes = pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
F>>>>>            nErrorCount++;
F>>>>>            
F>>>>>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
F>>>>>            else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
F>>>>>            else
F>>>>>            {
F>>>>>                pRecord3 = pRecord1->m_pFirstRecord; //Юзер попытался исправить ошибку, надо проверить заново
F>>>>>                continue;
F>>>>>             }
F>>>>>       }
F>>>>>   }
F>>>>>}
F>>>>>


F>>>>>Я бы так написал, а как другие пишут мне глубоко по барабану, лишь бы не мне читать и править.

F>>>>>Но в данном конкретном случае оба варианта имеют право на жизнь.
F>>>>>Хотя если бы не комментарий в ключевой строке, дольше бы понимал суть.

P>>>>Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.

P>>>>А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?

F>>>Ну ну, ты еще скажи что код не эквивалентен оригиналу.


P>>


P>>А что, таки и эквивалентен? В твоей реализации цикл после continue продолжиться не с начала. Т.е. если в первом же проходе возникла ошибка, то после pRecord3 = pRecord1->m_pFirstRecord; цикл будет продослжен с pRecord3 = pRecord3->m_pNextDirectory, т.е. со следующей записи.

P>>Не говоря уже о том, что менять переменную цикла в самом цикле ето, ну, скажем не совсем хорошо. Имхо, много похуже пресловутого goto.

P>>Хинт, посмотри в отладчике:


P>>
P>>for(int i = 0; i < 5; i++) {
P>>    if(i == 1) {
P>>        i = 0;
P>>        continue;
P>>    }
P>>}
P>>


F>


F>Даже смотреть не буду, я просто знаю что код


F>
F>for(int i = 0; i < 1; i++) continue;
F>


F>Это будет ВЕЧНЫЙ цикл. i++ никогда не произойдет.


Млин сори, я ошибся
Все гениальное — просто
Re[17]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.06.02 08:46
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Никуда они не денутся. Если вложенный цикл легко убирается, значит он вообще нафиг не нужен в данном алгоритме, и программисту следовало убрать его из программы самому. Если же он действительно нужен, никакой оптимизатор его не уберёт.


Ты забываешь про вызовы inline-функции, пустых(на данных момент) функции и т.д.

struct Class
{
  Create(){}
  Destroy(){}
  int Value (){return 1;}
};

Class class[10];
//вот такой цикл компилятор может запросто выкинуть, но я бы "обиделся" на программиста,
// если бы он убил бы этот цикл сам.
for (int i = 0;i < 10; ++i)
{
  class[i].Create();
}


//то же самое и здесь, хороший оптимизатор развернет это в int sum = 10;
int sum = 0;
for (int i = 0; i < 10; ++i)
{
  sum += class[i].Value;
}
Re[11]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 05.06.02 08:57
Оценка:
Здравствуйте Patalog, Вы писали:

P>ЗЗЫж Вот я и говорю, после ваших ответов у меня складывается впечатление, что все ето замечательное "граммотное структурное программирование" нужно людям дабы править баги после релиза. А не проще то время, которое нужно чтобы каждый чих обернуть в "объектную обертку" (sorry за тафтологию), пытаться вместо одного goto городить кучу if'ов\флагов\и т.д. потратить на то чтбы просто нормально написать\отладить.


А если произнести магические слова "изменение требований заказчиком"? Структурный (тем более ОО) код подстраивается под новые требования значительно быстрее монолитного.
Re[9]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 05.06.02 09:02
Оценка:
Я тут подумал...
Да согласен в данном случае goto лучшее решение, без него получается изврат.
Все гениальное — просто
Re[18]: Выйти из двух циклов сразу
От: Alexander Shargin Россия RSDN.ru
Дата: 05.06.02 09:32
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Alexander Shargin, Вы писали:


AS>>Никуда они не денутся. Если вложенный цикл легко убирается, значит он вообще нафиг не нужен в данном алгоритме, и программисту следовало убрать его из программы самому. Если же он действительно нужен, никакой оптимизатор его не уберёт.


DG>Ты забываешь про вызовы inline-функции, пустых(на данных момент) функции и т.д.

[skip]

Да, согласен, про уборку цикла программистом я погорячился. Но согласись, что это не меняет сути. Вложенные циклы с большим количеством итераций используются в таких областях, как математические расчёты, обработка текста и т. п. Там они делают содержательную, полезную работу, которую никуда не уберёшь. Чудес не бывает.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[12]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 05.06.02 09:52
Оценка:
Здравствуйте m.a.g., Вы писали:

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


P>>ЗЗЫж Вот я и говорю, после ваших ответов у меня складывается впечатление, что все ето замечательное "граммотное структурное программирование" нужно людям дабы править баги после релиза. А не проще то время, которое нужно чтобы каждый чих обернуть в "объектную обертку" (sorry за тафтологию), пытаться вместо одного goto городить кучу if'ов\флагов\и т.д. потратить на то чтбы просто нормально написать\отладить.


...>А если произнести магические слова "изменение требований заказчиком"? Структурный (тем более ОО) код подстраивается под новые требования значительно быстрее монолитного.


С _этим_ никто не спорит. Как говориться, знал бы где упасть...

И нужно не забывать и то, что граммотно разработанный прект и "граммотное структурное программирование", рассчитываемые на эти самые "магические слова" требуют много больше времени\сил\средств.
И в случаях подобных этому (повторюсь, мы говорим о "девушке в железно ящичке") я предпочту пару goto, чем пытаться "структурировать" алгоритм, по методу Vlad'а.
Почетный кавалер ордена Совка.
Re[2]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 05.06.02 09:58
Оценка:
Здравствуйте Whisperer, Вы писали:

W>Ау знатоки программирования :wow: может вы другие темы смотреть будете и помогать желающим, а

W>вы обсасываете старую избитую тему (вчем прикол — поговорить, для этого chat существует).
W>Я смотру если появляется хороший вопрос — ответов или 0 или <10 .

А можно хотя бы пару примеров "хороших" по твоему мнению вопросов?
Которые интересны не только самим спрашивающим?

W>Зато на такие темы вы кидаетсесь

W>как голодные ... (извеняюсь вырвалось). И необежайтесь если я неправ. Мне здесь тоже помогали.
W>Но активность — только из-за таких тем. :user:
Re[3]: Выйти из двух циклов сразу
От: Whisperer  
Дата: 05.06.02 10:12
Оценка:
Здравствуйте DarkGray, Вы писали:

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


W>>Ау знатоки программирования может вы другие темы смотреть будете и помогать желающим, а

W>>вы обсасываете старую избитую тему (вчем прикол — поговорить, для этого chat существует).
W>>Я смотру если появляется хороший вопрос — ответов или 0 или <10 .

DG>А можно хотя бы пару примеров "хороших" по твоему мнению вопросов?

DG>Которые интересны не только самим спрашивающим?

W>>Зато на такие темы вы кидаетсесь

W>>как голодные ... (извеняюсь вырвалось). И необежайтесь если я неправ. Мне здесь тоже помогали.
W>>Но активность — только из-за таких тем.

Каюсь я это все созлости написал. (уменя проблема с отображением курсора, а ответа в
Delphi & Builder — стоящего нет). Извените если кто обиделся.
Re[17]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 05.06.02 11:16
Оценка:
Здравствуйте Patalog, Вы писали:

P>Пардон, вмешаюсь...


Ничего... ничего...

P>Странные у тебя аргументы. То ты говоришь о некоем абстрактном горе-программисте, которому ни в коем случае нельзя давать в руки страшное оружие goto. И тут же приводишь в пример себя любимого, дескать "я никогда не перепутаю порядок освобождения ресурсов, если он важен" и далее по тексту. А что мешает этому абстрактному программисту перепутаь?


Ты бы почитал внимательнее о чём речь, что-ли

P>И еще, касательно 3-го пункта "аргументов": А ежели этот самый ресурс, который ты будешь открывать и закрывать в каждой итерации сильно долго открывается\закрывается?


А если сильно быстро?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 13:06
Оценка:
Здравствуйте m.a.g., Вы писали:

P>>ЗЫж Не флейма окаянного ради, может я и правда чего не знаю/понимаю?


...>Для детального анализа нужна мат. логика и обобщенная теория моделей вкупе с теорией категорий.


Новая струя в споре.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 13:39
Оценка:
Здравствуйте Patalog, Вы писали:

P>Странные у тебя аргументы. То ты говоришь о некоем абстрактном горе-программисте, которому ни в коем случае нельзя давать в руки страшное оружие goto. И тут же приводишь в пример себя любимого, дескать "я никогда не перепутаю порядок освобождения ресурсов, если он важен" и далее по тексту. А что мешает этому абстрактному программисту перепутаь?


Перепутать одинаково легко как с if-ами, так и с goto. Для освобождения ресурсов в С++ есть замечательное решение: создавать классы-обертки. Используя их ничего не перепутаешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 13:44
Оценка:
Здравствуйте Patalog, Вы писали:

P>Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.


Заметь. Суть уже непоняли двое. Причем это ты заметил, что двое. На самом деле 80% не поняли. Или не поняли с первого раза. Вот именно в этом и состоит проблема goto.

P>А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?


Пояснять. Твой код и коментарии вообще ничего не поясняют. Давай так, ты расказывешь идею (что нужно?), а мы предлагаем решение которое по нашему мнению будет правильным и читабельным. А то получается игра-дагадайка. IT правильно заметил. Не плохо было бы весь код показать, а не фрагмент. Может у тебя пробемы просто в композиции, а это место просто упурлось в них?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 14:04
Оценка:
Здравствуйте Patalog, Вы писали:

VD>>Ну, а как ошибочка в тоем замечательном монолите? А ты ркутой goto-шник на goto-зил и свалил в другую контору. Что делать тем беднягам которым приказано исправить ошибку и выложить в Inet патч?


P>Какой такой Inet в городе Мухосранске? Мсье не допонял исходную посылку. И какая такая ошибка, если монолдит замечательный?


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

P>Ежели в моем "замечательном монолите" будет критическая ошибка меня и так уволят


А толку, то? Исправить то твой монлит уже никто не сможет.

P>И не только меня. А если на этапе эксплуатации обнаружится не критическая ошибка, то баги перековываются в фичи


Вот именно так (судя по коду) думают многие программеры из MS. И именно из-за такого отношения в ворде вот уже 4 версии подряд сидят один и теже глюки.

Приятно только одно... Так хамить могут только очень богатые контры. Маленьким это грозит разорением. Вот Гупта не смогла вовремя переписать энжин своего SQLBase и нету боьше гупты.

P>ЗЫж Что будут делать те "бедняги" меня нисколько не волнует, ибо в человеколюбии замечен не был. Да и самому не раз приходилось оказываться в такой ситуации. Хотя все зависит от ситуации.


Ну, кичись, кичись. По крайней мере когда в следующий раз попадешь в эту шкуру, будешь вспоминать.

P>ЗЗЫж Вот я и говорю, после ваших ответов у меня складывается впечатление, что все ето замечательное "граммотное структурное программирование" нужно людям дабы править баги после релиза.


Да. И для этого тоже. Потому, что ни твои, ни мои, не MS-ные, ни чьи другие коды без ошибок не бывают (если это не ХаляваВолд). И порой пролежают и критичные, или не критичные, но сильно действующие на нервы.

Я вот все время пользовался ERWin-ом, но теперь видимо больше не буду. Количесвто глюков в 4-й версии меня в этом убедила.

P>А не проще то время, которое нужно чтобы каждый чих обернуть в "объектную обертку" (sorry за тафтологию), пытаться вместо одного goto городить кучу if'ов\флагов\и т.д. потратить на то чтбы просто нормально написать\отладить.


Если было проще, то IT и я сдесь не матерились бы. Он тебе уже сказал, что именно такой подход как ты описываешь тормозит развитие этого сайта. Да и вранье это, что создание оберток замедляет процесс разработки. В программе 10-15 типов ресурсов которые нужно контролировать. Для 70% обертки уже есть. Так что из года ты убьешь на это занятие две недели. Зато потом, тебе не придется убивать кучу времени на встраивания такого же кода после меток от goto и отлаживать каждое такое место. Не придется так же и следить за последовотельностю освобождения этих ресурсов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 05.06.02 14:10
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Не... я под предметной областью понимаю: управление предпиятем, статистика. Видишь как сегодня разрабатываются игры? Обычно пишется энжин и редактор. Причем редактор является CASE-средством.


Не является. Поскольку не поддерживает методик SE. Кодогенератором — да является.

VD>Но не убогим вроде Розы, а способным выдовать конечные продукты.


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

VD>Вот хочется нечто подобное только для других областей. Конечно здорово было бы создать универсальный энжин и унивесальный редактор, но пока я реальных путей решения этой проблемы не вижу.


Самое универсальное, что есть — операционные системы, компонентые модели и ЯВУ. Во что-то другое типа универсального движка/редактора я не верю, даже для управления предприятием и/или игр. Для полноты хотелось бы добавить, что не верю и в неуниверсальные энжины/редакторы, но это будет уже перебор.
GS
Re[14]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 14:33
Оценка:
Здравствуйте Sergey, Вы писали:

VD>>
S>   код поскипан.
VD>>


S>Ну про такой код что говорить — типичный пример сишного стиля в С++ коде. Либо писал человек, которого Страус так и не убедил, что С++ — савсэм другой язык, нежели С, либо это легаси и переписывать некогда/незачем было.


Это реальный код поставляемый MS. У них есть круче на порядки. Я тут тоже приводил... Вот он ДИКО глчит и по сравнению с ним этот просто идеален.

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

S>А у нас в конторе оптимизатор запрещен, как у некоторых goto . А без нагромождения циклов иногда не обойдешся.


Ну, это это уже явно тяжелое детство вашего начальства. А нагромаждение циклов... Мы как то обходится.

S>А исключения


Мы пишим на ATL. С ATL_MINCRT, так что исключения для нас исключены.

S>(для того же STL нужны, кстати)?


Для некоторых реализаций не нужны. К тому же привязка исключений к CRT — это проблемы конкретной версии компилятора. Ну, и есть разные минимальные сабсеты CRT. У нас на сайте есть статья о том как жить без CRT. Там и про ток как STL использовать без исключений сказано.

S>А конструкция/деструкция глобальных объектов (я слышал, в семерке для это рантайм не нужен, но у меня )?


В VC7 эта проблема решена. К тому же можно жить как жили до недавнего времени мы. Есть один объект без деструктора и конструктора. Все что должно быть глобально кладем в него... Создаем его в хипе и вручную вызваем коструктор и деструтора.

S>Строки/локали STLные тоже за собой рантайм тянут. А плавающая точка? К четырем прибавть два, конечно, и без CRT можно, но вот чтоб юзеру результат показать — уже хотя бы printf нужен.


Без строк придется пережить. printf в GUI-приложениях не нужен (да и есть реализации MinCRT котрые дают его реализации). Ну, а sprintf реализован в Win32 API.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 05.06.02 15:00
Оценка:
Здравствуйте VladD2, Вы писали:

S>>Ну про такой код что говорить — типичный пример сишного стиля в С++ коде. Либо писал человек, которого Страус так и не убедил, что С++ — савсэм другой язык, нежели С, либо это легаси и переписывать некогда/незачем было.


VD>Это реальный код поставляемый MS. У них есть круче на порядки. Я тут тоже приводил... Вот он ДИКО глчит и по сравнению с ним этот просто идеален.


VD>Когда же человек отказывается от готу, то со временем сам код становится лучше, так как ему приходится продумывать его структуру более глубого.


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

S>>А у нас в конторе оптимизатор запрещен, как у некоторых goto :). А без нагромождения циклов иногда не обойдешся.


VD>Ну, это это уже явно тяжелое детство вашего начальства. :) А нагромаждение циклов... Мы как то обходится. :shuffle:


Задачи разные, я думаю.

S>>А исключения


VD>Мы пишим на ATL. С ATL_MINCRT, так что исключения для нас исключены. :)


S>>(для того же STL нужны, кстати)?


VD>Для некоторых реализаций не нужны. К тому же привязка исключений к CRT — это проблемы конкретной версии компилятора. Ну, и есть разные минимальные сабсеты CRT. У нас на сайте есть статья о том как жить без CRT. Там и про ток как STL использовать без исключений сказано.


Значит, по пунктам:

1) STL без исключений — не STL. Просто потому, что vector<T>::at обязан кидать out_of_range при выходе за границы.
2) Привязка исключений к CRT действительно зависит конкретной версии компилятора. У меня версия вполне конкретная :) Да и ценность реализации исключений С++ (не SEH) вне CRT довольна сомнительна — примерно как CRT статически линковать. (возможно, тут я ошибаюсь).
3) Статью читал. Только вот про самое интересное там не написано (детально про fp, например). Очевидно, потому что нафиг это никому не надо — трахаться с плавающей точкой без CRT.
4) Ну, про STL без исключений я уже высказался.
Вообще-то, я пару программок без CRT писал, но только там, где это реально было надо. Но это все был равно не С++ :)

S>>А конструкция/деструкция глобальных объектов (я слышал, в семерке для это рантайм не нужен, но у меня )?


VD>В VC7 эта проблема решена. К тому же можно жить как жили до недавнего времени мы. Есть один объект без деструктора и конструктора. Все что должно быть глобально кладем в него... Создаем его в хипе и вручную вызваем коструктор и деструтора.


Вот я и говорю — это не С++. Хотя подобным образом извращаться, конечно, иногда приходится.

S>>Строки/локали STLные тоже за собой рантайм тянут. А плавающая точка? К четырем прибавть два, конечно, и без CRT можно, но вот чтоб юзеру результат показать — уже хотя бы printf нужен.


VD>Без строк придется пережить. printf в GUI-приложениях не нужен (да и есть реализации MinCRT котрые дают его реализации). Ну, а sprintf реализован в Win32 API.


Я sprintf и имел в виду. А реализация wsprintf, wvsprintf и вообще любого форматирующего вывода в WinAPI не поддерживает плавающую точку (что, впрочем, не удивительно).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[9]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 05.06.02 15:26
Оценка:
Здравствуйте Patalog, Вы писали:

P>Я — за :super:


Создавай голосование, посмотрим результаты.

IT>>Ты говоришь как типичный одиночка...


P>Может быть. Скорее даже так и есть...


Всё понятно, дальше можно не объяснять. Частенько у одиночек вырабатывается комплекс "Первый парень на деревне". Симптомы просматриваются. Просто один маленький совет, когда будешь менять работу помни, что кое-кто может не захотеть подстраиваться под твои взгляды.

P>ЗЗЫж У нас был один менеджер, который пытался уволить одного как ты выразился одиночку (не меня), дело закончилось тем что выгнали менеджера. И, имхо, это правильно.


Раз выгнали, значит был плохой менеджер, вот и всё. Никакой связи с использованием goto я тут не вижу ;)
Если нам не помогут, то мы тоже никого не пощадим.
Re[32]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 15:44
Оценка:
Здравствуйте George_Seryakov, Вы писали:

VD>>Не... я под предметной областью понимаю: управление предпиятем, статистика. Видишь как сегодня разрабатываются игры? Обычно пишется энжин и редактор. Причем редактор является CASE-средством.


GS>Не является. Поскольку не поддерживает методик SE.


Вот тебе цитата из Лингво:
CASE  
сокр. от computer-aided software engineering  
автоматизированное проектирование и создание программ


Так как игра это программа, а редактор позволяет ее создавать, то значит является.

GS>Кодогенератором — да является.


А вот кодогенератором не обязательно. Хотя что называть кодом...

GS>"Но не убогим вроде редактора уровней, а способным поддерживать методики проектирования".


А мне проектирование ради проектирования не нужно. Мне результат нужен.

Вот редактор уровней со своей задачей справляется. Может не на пятерку, но все же. Без него игры были бы приметинее и убогее (как 10 лет назад). А проектирование и сегодня вручную делатся с той же эффективностью, что на Розе. Только меньше геммороя.


VD>>Вот хочется нечто подобное только для других областей. Конечно здорово было бы создать универсальный энжин и унивесальный редактор, но пока я реальных путей решения этой проблемы не вижу.


GS>Самое универсальное, что есть — операционные системы, компонентые модели и ЯВУ. Во что-то другое типа универсального движка/редактора я не верю, даже для управления предприятием и/или игр. Для полноты хотелось бы добавить, что не верю и в неуниверсальные энжины/редакторы, но это будет уже перебор.


Что в них верить, то? Поставь себе Кваку или Старкрафт и убедись. Они универсальны для своей области.

А в Яву я не верю. Это всего лишь еще один язык программирования. Переносимость мне не нужна...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 15:57
Оценка:
Здравствуйте Sergey, Вы писали:

S>Не, не надо путать причину со следствием. Тут не готу у человека отбирать надо, а конкретно дать ему по башке, чтоб выучил новый язык.


Если бы это было возможно... А вот если отнять гоуту, то он сам будет вынужден выучить язык.

S>Задачи разные, я думаю.


Это же в какой задаче увеличение скорости программы на порядок и более может быть не нужна?


S>1) STL без исключений — не STL. Просто потому, что vector<T>::at обязан кидать out_of_range при выходе за границы.

S>2) Привязка исключений к CRT действительно зависит конкретной версии компилятора. У меня версия вполне конкретная Да и ценность реализации исключений С++ (не SEH) вне CRT довольна сомнительна — примерно как CRT статически линковать. (возможно, тут я ошибаюсь).
S>3) Статью читал. Только вот про самое интересное там не написано (детально про fp, например). Очевидно, потому что нафиг это никому не надо — трахаться с плавающей точкой без CRT.

Значит плохо читал. А про флоат без CRT... Не просто можно но и очень даже ничего получаетя. Это я тебе говорю, так как мы с БД без CRT работаем, а там флоаты частенько поадаются. Тащить за собой лишний мегобайт нам не охота (именно столько набегает если CRT использовать). К тому же есть еще один плюс. Наш код лучше использует настройки нет.

S>Вообще-то, я пару программок без CRT писал, но только там, где это реально было надо. Но это все был равно не С++


Мы пишим COM-библиотеки и нужно распространять их по сети.

S>Вот я и говорю — это не С++. Хотя подобным образом извращаться, конечно, иногда приходится.


Изваращаться все равно по какому-нибудь поводу придется. Мы на вычистку CRT один раз потратили две недели и не жалеем.

S>Я sprintf и имел в виду. А реализация wsprintf, wvsprintf и вообще любого форматирующего вывода в WinAPI не поддерживает плавающую точку (что, впрочем, не удивительно).


Плавающую точку поддерживает automation API. Причем на порядок лучше чем CRT. Многие программы вообще флоат не используют. Но я стабой согласен, что на отказ от CRT должна быть причина. На VC6 это трах. На семерке уже по проще.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 16:09
Оценка:
Здравствуйте WolfHound, Вы писали:

WH>Можно и так, но как писать это ЛИЧНОЕ дело программиста и пытаться изменить стиль того чьи программы РАБОТАЮТ это ВРЕДНАЯ трата времени.


Этот код легко прочесть и легко понять (в отличии от исходного). А "ЛИЧНОЕ дело" у программиста может быть только когда он пишит код который нужен только одному ему.

Вообще это примен замечательно показывает что лучше жить без goto.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Выйти из двух циклов сразу
От: Chorkov Россия  
Дата: 05.06.02 16:42
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Alexander Shargin, Вы писали:


DG>В таких задачах часто можно сделать двухмерный "итератор" (в паре задач я так делал, когда надо было часто бегать по двухмерной областе).


DG>
DG>for (Pos i(0, 0); i < Pos(1000, 1000); ++i)
DG>{
DG>  if (i.x == 666 && i.y == 123)
DG>    break;
DG>}
DG>



IT>>>1. Флаг в первом цикле

IT>>>2. Проверка счётчика второго цикла на завершённость
IT>>>3. return
IT>>>4. inline процедура (очень специфический вариант, но возможный)

DG>Я бы еще добавил:

DG>5. использовать goto, но спрятать за макросами (одиннаковыми для всей команды)
DG>6. вышеприведенный двухмерный "итератор"

Вариант 7 (или это разновидность варианта 6 ?)
Я, обычно вместо "двумерных итераторов" использую два итератора в for:

for(int i=0,j=0; j<1000 ; i<1000 ? i++ : (i=0, j++) )
{
    if(i==666 && j==123)
        break;
};


А сам for прячу за максросами ...
#define for2(Start_1,Cond_1,Next_1,Start_2,Cond_2,Next_2)        for((Start_1),(Start_2) ; (Cond_2) ; (Cond_1) ? (Next_1) : ((Start_1), (Next_2)) )

Но эта техника применима только сли обходимая облась имеет несложную структу (прямоугольник или треугольник ...).
Кроме того, вложенные циклы, даже в выч.-математике, это , как правило, не просто обход многомерных массивов.
Re[34]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 19:17
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>А что Лингво говорит по поводу goto? Тоже, небось, какую-нибудь ересь...


Это не ерись. Это общепринятое определение.

А про goto...

1. GOTO statement  оператор перехода
2. GOTO-less programming  программирование без (применения операторов) GOTO

Вот второй вариант мне нравится.

VD>>А мне проектирование ради проектирования не нужно. Мне результат нужен.


GS>А мне кодирование ради кодирования не нужно.


А я что это говорил? Не... тебе показалось. Кодирование оно тоже ради результата. Это когда статьи пишишь, то кодируешь 4fun...

GS>Сколько ты "проектируешь"? 1% времени? Никому больше это не говори. Правильные пацаны проектируют от 10 до 50 % времени.


Специально я не считал, но скорее всего 1-5%. Я вообще-то не кодер. На мне еще куча обязанностей.

GS>Правильные пацаны проектируют от 10 до 50 % времени.


Да мне что жалко что ли? Пускай... У меня в процесс проектирования обычно и программист вовлекается. Чем лучше спроектируем, тем проще ему делать будет. Но время проектирования, да и кодирования — это пустяки по сравнению с доведение до релиза. Одни хелпы занимают уйму времени. Специальных людей на это нет. Так что... Вот если бы было пара сотен безхозных программеров высокого уровня, то пришлось бы только этим и заниматься.


VD>>Что в них верить, то? Поставь себе Кваку или Старкрафт и убедись. Они универсальны для своей области.


GS>"Они летают, но низэнько-низэнько..."


Они работают. Сам видел.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 19:27
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Резюме:

DG>1. как только у вас в программе появляется конструкция try/catch, то всё, что внутри try будет работать в полтора раза медленнее (за исключением простых случаев, когда весь подставляемых код в try не содержит внешних вызовов & выбросов исключений).

Неправильное резуме. Все зависит от количества кода. Все может быть и лучше и хуже. Если цикл делает серьезную работу, то затраты на try нивилируются.

Но использовать throw для выхода — это конечно перл. Проще сделать return или ввести в цикла дополнительную пременную.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 19:50
Оценка:
Здравствуйте WolfHound, Вы писали:

Я так понимаю здесь for был лишним. Вот так вроде будет проще:

SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord;
while(pRecord3 != NULL);
{
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            if(nCallBackRes != CCB_RES_MAKEAUTO && nCallBackRes != CCB_RES_IGNORE) 
            { 
               //Юзер попытался исправить ошибку, надо проверить заново
               pRecord3 = pRecord1->m_pFirstRecord;
               continue;
            }
            //OK, продолжаем дальше
       }
    }
    pRecord3 = pRecord3->m_pNextDirectory;
}


За одно и от лишнего цикла избавились.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 20:34
Оценка:
Здравствуйте George_Seryakov, Вы писали:

VD>>Это не ересь. Это общепринятое определение.


GS>http://denisbooks.rema.ru:8101/peaple.out.html


Да. Действительно там написано, что ты прав, а я ламер никогда не видевший CASE-средств. :)

Может объяснишь мне тупому как надо правильно воспринимать понятие CASE?

GS>"Они универсальны, но в своей области".


Да. Универсальность понятие растяжимое. Было бы здорово иметь средство автоматизирующее процесс создания любого ПО, но пока этого нет. Успех достигнут только в проектировании БД. Я же хочу иметь нечто, что поможет не только проектировать но и автоматически реализовывать. Пусть даже в узкой области.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 20:55
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

VD>>Так вот используя goto головой люди обычно и не думают. По этому я призываю начинающих думать головой и никогда не использовать goto.


AS>Ну, это уже демагогия.


Да? Ну, залезь в какие-нибудь исходники погляди. Я вот недавно покопался в Microsoft-овских. 80% использования goto или от лени или от лама. Человеку в лом сделать одну маленькую обертку для контроля памяти и он лепит поре грязнейшего кода.

AS>Похоже, вам с IT довелось много общаться с людьми, которые переходили на C++ со всяких там фортранов и алголов.


Скажу больше. Я видел (и похоже IT тоже) людей которые значительно подняли свой класс отказавшись от goto.

AS>А мне, например, нет.


Ну, что же... тебе повезло.

AS>Меняются поколения, меняются идеалы. Сейчас программисты с самого начала учатся использовать goto умеренно (во всех нормальных книгах об этом написано).


Именно. Более того, новые программисты особо и не испытывают нужды в этом операторе. Привязанность к goto болше у старшего поколения.

AS>Поэтому твои обобщения на "людей", которые "обычно не думают" — не более чем пустые слова.


Повторяюсь. Это не обобщения. Это наблюдения (статистика). Я не исключаю, что можно найти матерого волка, который виртуозно пользуется goto и прекрасно читает такой код, но его код плохо понимают другие.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 21:14
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

VD>>Во блин! Эффективность на goto! Линукс это давно тормозная и разжиревшая ОС ни чем не отличающаяся от NT.


AS>Речь о ядре, а не о Линуксе в целом. На его основе, между прочим, строят системы реального времени. Из Виндоусов на это может претендовать только CE, но и от неё в этом качестве серьёзные фирмы по размышлении зрелом отказались.


Да. Действительно... Вот DOS тоже подходит для реалтайм-задач. Давай по этому критерию скорость оценивать.

VD>>А современные оптимизирующие компиляторы к котрым смело можно причислить VC (которым пользуется MS) и gcc (которым пользуются Линуксойды) оптимизируют в ноль весь оверхэд создаваемый ОО-обертками и лишние if уберают. От ваших вложеных циклов зачастую вообще кмня на камне не остается.


AS>Никуда они не денутся. Если вложенный цикл легко убирается, значит он вообще нафиг не нужен в данном алгоритме, и программисту следовало убрать его из программы самому. Если же он действительно нужен, никакой оптимизатор его не уберёт.


Кто они? Если циклы убираются, то их и уберут. Я говорю, о том, что если сделать выход на дополнительных проверках, то оптимизатор все это добро (с вероятностью 99%) уберет и конечный код будет таким же как с goto, но читать иходник будет проще.

Более того, появление goto может помешать оптимизатору и привести к замедлению.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 05.06.02 21:18
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Может объяснишь мне тупому как надо правильно воспринимать понятие CASE?


Сейчас значение этого слова совершенно размыто, и ты можешь воспринимать его почти любым образом, но, когда оно все-таки имело какой-то смысл, оно означало средство анализа и/или проектирования ПО. обычно структурного.
GS
Re[38]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.06.02 21:28
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Сейчас значение этого слова совершенно размыто, и ты можешь воспринимать его почти любым образом, но, когда оно все-таки имело какой-то смысл, оно означало средство анализа и/или проектирования ПО. обычно структурного.


Мне кажется ты просто узко понимаешь этот термин. Все таки engineering означает не только проектирование но и конструирование.

В конце концов если у меня в процессе проектирования получается готовое приложение и при этом нет стадии генерации кода, то как это назвать? Хотя как не называй, хоть Софто-CAD, все равно это лучше чем проектирование которое выливается в схемки, а программист потом все равно занимается перепроектированием, так как эти схемки далеки от реальной жизни.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 05.06.02 21:37
Оценка:
Здравствуйте VladD2, Вы писали:

GS>>Сейчас значение этого слова совершенно размыто, и ты можешь воспринимать его почти любым образом, но, когда оно все-таки имело какой-то смысл, оно означало средство анализа и/или проектирования ПО. обычно структурного.


VD>Мне кажется ты просто узко понимаешь этот термин.


Да. И тебе советую.

VD>Все таки engineering означает не только проектирование но и конструирование.


А что, между проектированием и конструированием есть какая-то разница?

VD>В конце концов если у меня в процессе проектирования получается готовое приложение и при этом нет стадии генерации кода, то как это назвать?


Если ты пользовался описанием логики программы в виде отличном от самой программы, то это CASE.
GS
Re[10]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 01:48
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте m.a.g., Вы писали:


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


VD>>>Повторюь еще раз. goto не структурированный оператор. И его ипользование вност хаотичность в код.


...>>Про схемы Янова слышал? Посмотри — потом будешь говорить насчет неструктурированности. Все зависит от контекста.


VD>Нет. Не слыхал. А они помогут мне при чтении кода утыконого безсмысленными goto?


Нет. Но при написании программ в стиле схем Янова применение goto ни к чему плохому не приводит, код остается читабельным. Споры насчет goto бессмысленны вне контекста. Для структурного программирования это плохо — где-то в другой ветке этого топика я доказал чем.

...>>Единственное условие применения структурных конструкций — "правило отсутствия неожиданностей".

VD>Именно. У программисто вообще должно быть правило "не удивляй!".

Я имел в виду формальное "правило приятной неожиданности", разрушающее конструктивизм структурного программирования.
Re[5]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 01:56
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте m.a.g., Вы писали:


...>>Кстати, даже добавление break (не говоря уж о goto) к структурному программированию портит всю теоретическую картину — рушится весь конструктивизм и многие теоремы существования. Кстати, многие неудобные места в современных языках программирования — это просто следствия из неправильного теоретического проектирования языка.


P>Мсье теоретик?


Просто грамотный специалист, знающий не только прагматику и методологию, но и теорию. Кстати, я слегка ошибся, добавление break картины не портит, ее портит добавление break(n) или goto из внутреннего цикла.

P> Объясните популярно, что есть "рушится весь конструктивизм и многие теоремы существования"?


Надеюсь, все знают, что такое интуиционистская логика и естественный вывод?

Формализацией break(n) является "правило приятной неожиданности" (ппн): во внутреннем подвыводе доказана цель внешнего. Доказательство допустимости такого правила в классической логике строится по построению вывода и не представляет интереса.

Докажем, что (ппн) превращает интуиционистскую логику в классическую: для этого достаточно показать выводимость закона исключенного третьего:

* (A => B) => A
| * A
| | B
| A => B
| A
((A => B) => A) =>A

откуда следует закон исключенного третьего.

Конструктивизм разрушен.

P>И как эту задачу решить с точки зрения "правильного теоретического проектирования".


Переписать код так, чтобы этой проблемы не возникало.
Re[8]: Пример монолитной программы :)
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.06.02 03:38
Оценка:
Как прикол — пример "монолитного" кода, полученного как "издевательство" над исходным примером Patalog (прошу простить), но работоспособный также как и исходный. Захочешь, а не исправишь.

И что самое главное — такой примерно код я и видел собственными глазами. Жаль не сохранил для истории. Ей богу не вру.

equal:for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) { nRes = CompareRecord(pRecord2, pRecord3, nType)
== 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR; if(nRes != CCB_ERR_NOERROR) { pCheckControl->m_data1 =
reinterpret_cast<long>(pRecord2); pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3); nCallBackRes =
pCheckControl->DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
nErrorCount++; if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
else goto equal; //Юзер попытался исправить ошибку, надо проверить заново
}}}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[11]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 04:15
Оценка:
Здравствуйте VladD2, Вы писали:

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


VD>Я так понимаю здесь for был лишним. Вот так вроде будет проще:


VD>
VD>SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord;
VD>while(pRecord3 != NULL);
VD>{
VD>    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
VD>    {
VD>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
VD>                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
VD>       if(nRes != CCB_ERR_NOERROR)
VD>       {
VD>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
VD>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
VD>            //Передается юзеру, который должен как-то отреагировать на ошибку
VD>            nCallBackRes = pCheckControl->DoControl(nRes); 
VD>            nErrorCount++;
VD>            
VD>            if(nCallBackRes == CCB_RES_ABORT) 
VD>               return nErrorCount; //Failed, отмена
VD>            if(nCallBackRes != CCB_RES_MAKEAUTO && nCallBackRes != CCB_RES_IGNORE) 
VD>            { 
VD>               //Юзер попытался исправить ошибку, надо проверить заново
VD>               pRecord3 = pRecord1->m_pFirstRecord;
VD>               continue;
VD>            }
VD>            //OK, продолжаем дальше
VD>       }
VD>    }
VD>    pRecord3 = pRecord3->m_pNextDirectory;
VD>}
VD>


VD>За одно и от лишнего цикла избавились.


Vlad, а ты не думаешь, что изменение переменной цикла внутри цикла вешь более взрывоопасная, чем goto?
Почетный кавалер ордена Совка.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 04:52
Оценка:
Здравствуйте VladD2, Вы писали:

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


P>>Похоже суть ты так и не понял. Ежели было все так просто, ни о каком goto в данном случае речи бы не было.


VD>Заметь. Суть уже непоняли двое. Причем это ты заметил, что двое. На самом деле 80% не поняли. Или не поняли с первого раза. Вот именно в этом и состоит проблема goto.


Отучаемся говорить за всех, даже и за 80%.

А суть того, что конкретно делает данный отрывок, я думаю из более другой оперы. Или тебе сеже не ясна суть алгоритма?
Поясняю — в цикле проверяется некое условие, при не выполнении этого условия управление передается клиенту. После этого, в зависимости от результата, нужно либо выйти из функции, либо продолжить цикл, либо прогнать цикл заново. Ты серьезно говоришь, что этого не понял? Или так, для красного словца, типа goto сделал код настолько непонятным, что никто понять не может?

P>>А комментарий в ключевой строке гласит "Юзер попытался исправить ошибку, надо проверить заново". Дальше продолжать?


VD>Пояснять. Твой код и коментарии вообще ничего не поясняют. Давай так, ты расказывешь идею (что нужно?), а мы предлагаем решение которое по нашему мнению будет правильным и читабельным. А то получается игра-дагадайка. IT правильно заметил. Не плохо было бы весь код показать, а не фрагмент. Может у тебя пробемы просто в композиции, а это место просто упурлось в них?


Что, прямо таки весь код показывать? Так его достаточно много... Вообще ето код генерации isofs (Level 1, 2, 3 и Joilet Ext).

Проблема в чем, каждый идентификатор (имя файла, директории) должен соответствовать определенным критериям вышеупомянутых стандартов (типа того что имена файлов на одном уровне вложенности не должны совпадать, иметь определенную длину, ограничивается общая длина идентификаторов от корня и т.д.). При нарушении одного из критериев пользователю предоставляется возможность исправить ошибку (типа как Nero ругается, что имя длинной более 255 символов и предлагает сократить).

Кусок кода, который я привел проверяет идентификатор на уникальность на данном уровне вложенности. Для этого идентификатор сравнивается со всеми идентификаторами на данном уровне.
Если пользоватль решил отменить генерацию — ок, выходим, если игнорировать — ок, юзер знает что делает, продолжаем, если решил положиться на автоматическое исправление — ок, продолжаем (кстати в данной реализации игнорировать == автоматически исправлять), если же юзер все же внес исправленя необходимо вновь проверить новый идентификатор на соответствие.
Почетный кавалер ордена Совка.
Re[9]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 06.06.02 05:05
Оценка:
Не хотел бы показаться занудой, но может все-таки прекратить это изнасилование.
Вчера вечером решил проверить почту. Модем у меня дома слабенький — 21600.
Так вот, о чем это я... А. Вот. Проверяю почту и вижу незатейливаое такое число
писем 130... Я все добросовестно скачал. Все оказались с этого топика.
Это я к чему — может все-таки прекратить это изнасилование, а? может больше не
будем, а?

Остановимся может на том, что есть в языках такой оператор как
goto
.

Использовать ли его программеру-одиночке — это его личное дело и никто ему запретить
это не в силах (разве что мама, папа и домашнее животное какое).

Использовать ли его программеру, работающему в какой-либо "гнилой" фирмочке —
дело опять-же его личное, если он "Head of programming team" и убедит всех подчиненных
и непосредственного начальника в несомненной пользе и появлении всяческих благ после
использования
goto
.

Использовать ли его программеру, работающему в нормальной команде — дело спецификации
разработки программного обеспечения данной команды. Если "партия" сказала "Нет!",
"комсомол" должен будет ответить "Есть! Ура!Ура!Ура!".

Так может все-таки хватит?
Re[3]: Выйти из двух циклов сразу
От: Whisperer  
Дата: 06.06.02 05:09
Оценка:
Здравствуйте DarkGray, Вы писали:

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


W>>Ау знатоки программирования может вы другие темы смотреть будете и помогать желающим, а

W>>вы обсасываете старую избитую тему (вчем прикол — поговорить, для этого chat существует).
W>>Я смотру если появляется хороший вопрос — ответов или 0 или <10 .

DG>А можно хотя бы пару примеров "хороших" по твоему мнению вопросов?

DG>Которые интересны не только самим спрашивающим?

W>>Зато на такие темы вы кидаетсесь

W>>как голодные ... (извеняюсь вырвалось). И необежайтесь если я неправ. Мне здесь тоже помогали.
W>>Но активность — только из-за таких тем.

Итак я придумал хороший вопрос, если он понравится можно открать тему.
Мне приходится пользоваться MSN (аська у нас отключена).
Но внем несохраняется история разговора в окне(если его закрыть).
Вопрос как это зделать (можно перейти на совмесное решение проблемы).
Я посмотрел библиотека типов там есть. Но описания интерфейсов я пока
ненашел.А тема будет звучать так доработаем MSN если Билл этого делать
нехочет.
Re[12]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 05:25
Оценка:
Здравствуйте VladD2, Вы писали:

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


VD>>>Ну, а как ошибочка в тоем замечательном монолите? А ты ркутой goto-шник на goto-зил и свалил в другую контору. Что делать тем беднягам которым приказано исправить ошибку и выложить в Inet патч?


P>>Какой такой Inet в городе Мухосранске? Мсье не допонял исходную посылку. И какая такая ошибка, если монолдит замечательный?


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


Мсье был в городе Мухосранске? А ежели стоимость доставки дискетки сравнима по стоимости с железкой?

P>>Ежели в моем "замечательном монолите" будет критическая ошибка меня и так уволят


VD>А толку, то? Исправить то твой монлит уже никто не сможет.


Ты пробовал, ты знаешь. Все прекрасно правится. Может и не так быстро но правиться. А в данной ситуации (я повторюсь я возвел ее в ранг гиперболы, так же как и вы пресловутый "монолит") закладываться на возможные ошибки просто нерентабельно.

P>>И не только меня. А если на этапе эксплуатации обнаружится не критическая ошибка, то баги перековываются в фичи


Ты не представляешь, сколько _не_ критических ошибок (скорее ляпов) в таких вот железках. Может именно потому, что критических ошибок там _нет_ и быть не может.

VD>Вот именно так (судя по коду) думают многие программеры из MS. И именно из-за такого отношения в ворде вот уже 4 версии подряд сидят один и теже глюки.


VD>Приятно только одно... Так хамить могут только очень богатые контры. Маленьким это грозит разорением. Вот Гупта не смогла вовремя переписать энжин своего SQLBase и нету боьше гупты.


P>>ЗЫж Что будут делать те "бедняги" меня нисколько не волнует, ибо в человеколюбии замечен не был. Да и самому не раз приходилось оказываться в такой ситуации. Хотя все зависит от ситуации.


VD>Ну, кичись, кичись. По крайней мере когда в следующий раз попадешь в эту шкуру, будешь вспоминать.


Я уже был в этой шкуре. А думать за "того парня" — увольте, я не мать тереза. Кичится здесь нечему, это способ выживания.

P>>ЗЗЫж Вот я и говорю, после ваших ответов у меня складывается впечатление, что все ето замечательное "граммотное структурное программирование" нужно людям дабы править баги после релиза.


VD>Да. И для этого тоже. Потому, что ни твои, ни мои, не MS-ные, ни чьи другие коды без ошибок не бывают (если это не ХаляваВолд). И порой пролежают и критичные, или не критичные, но сильно действующие на нервы.


VD>Я вот все время пользовался ERWin-ом, но теперь видимо больше не буду. Количесвто глюков в 4-й версии меня в этом убедила.


P>>А не проще то время, которое нужно чтобы каждый чих обернуть в "объектную обертку" (sorry за тафтологию), пытаться вместо одного goto городить кучу if'ов\флагов\и т.д. потратить на то чтбы просто нормально написать\отладить.


VD>Если было проще, то IT и я сдесь не матерились бы. Он тебе уже сказал, что именно такой подход как ты описываешь тормозит развитие этого сайта. Да и вранье это, что создание оберток замедляет процесс разработки. В программе 10-15 типов ресурсов которые нужно контролировать. Для 70% обертки уже есть. Так что из года ты убьешь на это занятие две недели. Зато потом, тебе не придется убивать кучу времени на встраивания такого же кода после меток от goto и отлаживать каждое такое место. Не придется так же и следить за последовотельностю освобождения этих ресурсов.


Vlad, мы говорим о разных вещах. Я думаю нужно ставить точку на этом. Одно я знаю точно, что везде нужен\возможен компромисс. И называть всех людей, которые используют в своих программах не тривиальные приемы, тем самым затрудняя чтение\понимание кода среднестатистическим программерам, воинствующими ламерами, которых просто необходимо гнать поганой метлой, весьма неправильно, и более того, иногда может оказаться вредно для здоровья
Почетный кавалер ордена Совка.
Re[9]: Пример монолитной программы :)
От: Patalog Россия  
Дата: 06.06.02 05:31
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Как прикол — пример "монолитного" кода, полученного как "издевательство" над исходным примером Patalog (прошу простить), но работоспособный также как и исходный. Захочешь, а не исправишь.


Vi2>И что самое главное — такой примерно код я и видел собственными глазами. Жаль не сохранил для истории. Ей богу не вру.


Vi2>
Vi2>equal:for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) {
Vi2>if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) { nRes = CompareRecord(pRecord2, pRecord3, nType)
Vi2>== 0 ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR; if(nRes != CCB_ERR_NOERROR) { pCheckControl->m_data1 =
Vi2>reinterpret_cast<long>(pRecord2); pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3); nCallBackRes =
pCheckControl->>DoControl(nRes); //Передается юзеру, который должен как-то отреагировать на ошибку
Vi2>nErrorCount++; if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) continue; //OK, продолжаем дальше
Vi2>else if(nCallBackRes == CCB_RES_ABORT) return nErrorCount; //Failed, отмена
Vi2>else goto equal; //Юзер попытался исправить ошибку, надо проверить заново
Vi2>}}}
Vi2>


Так чего ж ты комментарии то оставил? 8-[ ] И приведения нужно в стиле С.
Всему вас учить приходится

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

Взято из фидо.
----------------------------------------------------------------------
>> но разбираться с горой чужих исходников у меня до этого получалось
>> всегда. А пёрл — не идет, со страшной силой не идет.

FK> А в чем проблема-то? Приведи пример куска кода, который не идет.


Hу, типа такого... Код работающий.

$\='`'|"'";$\++;$;='/'|'`';$;++;$;++;$;++;$,=$;;$,++;$/=$,;$/++;$:=$/;$:++;$
_='
%'|'`';$_.='`'|'#';$_.=$\;$_.='`'|'/';$_.=$".'"';$_.='@'|'*'&~'!';$_.="$:$,$
/".
$";$_.='`'|'!';$_.='`'|'.';$_.='/'|'`';$_.=$/.$\;$_.='%'|'`';$_.=$;.$";$_.='
@'|
':'&~'*';$_.='`'|'%';$_.=$;;$_.='`'|',';$_.=$".$\;$_.='`'|'!';$_.='#'|'`';$_
.='
+'|'`';$_.='`'|'%';$_.=$;.'"'.$".'>&';$_.=$,&':';`$_`;
----------------------------------------------------------------------
Почетный кавалер ордена Совка.
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 05:48
Оценка:
Здравствуйте IT, Вы писали:

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


P>>Я — за


IT>Создавай голосование, посмотрим результаты.


IT>>>Ты говоришь как типичный одиночка...


P>>Может быть. Скорее даже так и есть...


IT>Всё понятно, дальше можно не объяснять. Частенько у одиночек вырабатывается комплекс "Первый парень на деревне". Симптомы просматриваются. Просто один маленький совет, когда будешь менять работу помни, что кое-кто может не захотеть подстраиваться под твои взгляды.


Ну, вот, меня уже обвинили в мании величия...
Давай не будем затевать фаллометрию и переходить на личности.
А насчет советов, можно и не маленький. Я создал ветку в прочем, хотелось бы услышать твое (и не только твое) мнение более подробно, и без ненужного сарказма\ехидства.

P>>ЗЗЫж У нас был один менеджер, который пытался уволить одного как ты выразился одиночку (не меня), дело закончилось тем что выгнали менеджера. И, имхо, это правильно.


IT>Раз выгнали, значит был плохой менеджер, вот и всё. Никакой связи с использованием goto я тут не вижу
Почетный кавалер ордена Совка.
Re[13]: А такие варианты
От: Patalog Россия  
Дата: 06.06.02 06:10
Оценка:
Здравствуйте Vi2, Вы писали:

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


P>>Vlad, а ты не думаешь, что изменение переменной цикла внутри цикла вешь более взрывоопасная, чем goto?


Vi2>Ну хорошо, а такие варианты?


Vi2>Пример А (приемлемый, с goto, улучшенный вариант исходного: изменено имя метки, метка помещена внутрь блока как используемая "локально" (это, конечно, фигня — всё равно она видима "глобально", но, по крайней мере, такая техника имеет право на жизнь)


Похоже ты не входишь в 80%...
Видимо Vlad все таки прав в том, что у каждого свои "правила чтения исходников". _Мне_ 2-й вариант читать труднее.

[skip]
Почетный кавалер ордена Совка.
Re[11]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 06:29
Оценка:
Здравствуйте Patalog, Вы писали:

[skip]

P>А насчет советов, можно и не маленький. Я создал ветку в прочем, хотелось бы услышать твое (и не только твое) мнение более подробно, и без ненужного сарказма\ехидства.


Sorry, в работе.
Почетный кавалер ордена Совка.
Re[17]: Выйти из двух циклов сразу
От: Аноним  
Дата: 06.06.02 06:38
Оценка:
Здравствуйте VladD2, Вы писали:

S>>Не, не надо путать причину со следствием. Тут не готу у человека отбирать надо, а конкретно дать ему по башке, чтоб выучил новый язык.


VD>Если бы это было возможно... А вот если отнять гоуту, то он сам будет вынужден выучить язык.


S>>Задачи разные, я думаю.


VD>Это же в какой задаче увеличение скорости программы на порядок и более может быть не нужна?


Во-первых, применение оптимизатора не дает увеличение скорости программы на порядок (десятичный порядок, по крайней мере). Во-вторых, моя фраза о разных задачах относилось к "А нагромаждение циклов... Мы как то обходится".

S>>1) STL без исключений — не STL. Просто потому, что vector<T>::at обязан кидать out_of_range при выходе за границы.

S>>2) Привязка исключений к CRT действительно зависит конкретной версии компилятора. У меня версия вполне конкретная :) Да и ценность реализации исключений С++ (не SEH) вне CRT довольна сомнительна — примерно как CRT статически линковать. (возможно, тут я ошибаюсь).
S>>3) Статью читал. Только вот про самое интересное там не написано (детально про fp, например). Очевидно, потому что нафиг это никому не надо — трахаться с плавающей точкой без CRT.

VD>Значит плохо читал. А про флоат без CRT... Не просто можно но и очень даже ничего получаетя.

Нормально читал :) Там, если ты помнишь, про fp всего пара абзацов, которые кратко пересказать можно так: "Если вам надо использовать fp вычисления без CRT, сами разбирайтесь, какая функция что за собой тянет, мне влом этим заниматься".
Да и совет линковаться с LIBC.LIB вполне однозначен — это ж просто использование части CRT.

VD>Это я тебе говорю, так как мы с БД без CRT работаем, а там флоаты частенько поадаются.

И что вы с ними делаете? Юзеру показываете? А логарифм взять?

VD>Тащить за собой лишний мегобайт нам не охота (именно столько набегает если CRT использовать). К тому же есть еще один плюс. Наш код лучше использует настройки нет.


Что такое "настройки нет"?

S>>Вообще-то, я пару программок без CRT писал, но только там, где это реально было надо. Но это все был равно не С++ :)


VD>Мы пишим COM-библиотеки и нужно распространять их по сети.


Я не отрицаю, что есть класс задач, где CRT нафиг не нужна. Просто C++ без CRT — и не C++, и не C. И фиг его знает, что там после выхода очередного сервиспака глючить начнет.

S>>Вот я и говорю — это не С++. Хотя подобным образом извращаться, конечно, иногда приходится.


VD>Изваращаться все равно по какому-нибудь поводу придется. :) Мы на вычистку CRT один раз потратили две недели и не жалеем.


А начал использовать тяжеленный wxWindows и тоже не жалею :)

S>>Я sprintf и имел в виду. А реализация wsprintf, wvsprintf и вообще любого форматирующего вывода в WinAPI не поддерживает плавающую точку (что, впрочем, не удивительно).


VD>Плавающую точку поддерживает automation API. Причем на порядок лучше чем CRT. Многие программы вообще флоат не используют.


Если wsprintf еще можно хоть как-то замаскировать под sprintf, то с automation API этот номер не пройдет и код (вполне безразличная к операционке его часть) станет windows-only. Да и геморроя с ним на порядок больше, чем с sprintf и иже с ними.
Re[9]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 07:02
Оценка:
Здравствуйте Patalog, Вы писали:

P>ЗЫж Помниться я в одном из ответов Vlad'у срошивал All — какие у кого корпоративные правила кодирования. Ибо мне это действительно интересно, и я прекрасно знаю, что с о своим уставом, в чужой монастырь вредно для здоровья. Может все таки поговорим об этом?


Неплохо. Принимаю предложение. Если еще никто не завел подобную тему, заведу сам. Мне тоже интересны примеры корпоративных правил кодирования, документирования и т.д. и т.п.

P>ЗЗЫж У нас был один менеджер, который пытался уволить одного как ты выразился одиночку (не меня), дело закончилось тем что выгнали менеджера. И, имхо, это правильно.


Я менеджеров тоже не очень... Только вот Vlad — не менеджер.
Голь на выдумку хитра, однако...
Re[11]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 06.06.02 07:16
Оценка:
Здравствуйте m.a.g., Вы писали:

VD>>>>Повторюь еще раз. goto не структурированный оператор. И его ипользование вност хаотичность в код.


...>>>Про схемы Янова слышал? Посмотри — потом будешь говорить насчет неструктурированности. Все зависит от контекста.


VD>>Нет. Не слыхал. А они помогут мне при чтении кода утыконого безсмысленными goto?


...>Нет. Но при написании программ в стиле схем Янова применение goto ни к чему плохому не приводит, код остается читабельным. Споры насчет goto бессмысленны вне контекста. Для структурного программирования это плохо — где-то в другой ветке этого топика я доказал чем.


Оно, конечно, не слишком сложно чего-то доказать, если оппоненты даже со способом записи доказательства не знакомы. Вот я, например, слабо себе представляю, что именно подразумевается под написанием программ на C++ в стиле схем Янова. А если бы речь шла о записи изначально С++'ной программы на языке схем Янова, тогда о каком-таком goto (и вреде) идет речь? Об отсылающей полускобке? Или об условная полускобке? И вообще, тогда речь надо вести не о вреде goto, а о вреде схем Янова, потому как нормальный программист в этих кракозябрах нифига не поймет :)

А вообще, у оператора goto есть одна неприятная особенность — он потенциально может передать управление куда угодно, "вверх" или "вниз", в отличие от return или break. Струкутурно программа написана или как-то иначе, роли не играет — тупо увеличивается время на поиск метки. Чеолвек мыслит в основном идиомами, а неоправданное применение goto эти идиомы разбивает (оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup).

...>>>Единственное условие применения структурных конструкций — "правило отсутствия неожиданностей".

VD>>Именно. У программисто вообще должно быть правило "не удивляй!".

...>Я имел в виду формальное "правило приятной неожиданности", разрушающее конструктивизм структурного программирования.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[7]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 07:17
Оценка:
Здравствуйте Patalog, Вы писали:

P>Только к чему все это? Неужели "интуиционистская логика и естественный вывод" так часто применяется в кодировании? Может я тоже ее применяю, но просто не знаю об этом?


Не непосредственно. За любым языком стоит некоторая теория. Эмпирическое наблюдение, не претендующее на строгость и полноту: удобство языка прямо пропорционально силе теории, стоящей за ним. А естественный вывод я взял только потому, что для него теорема доказывается короче всего.

P>Pls, обьясни поподробней. Если подкинешь ссылки, будет просто Только, как говориться, для чайников.


В электронном виде мало чего есть. Так что могу посоветовать только

Н.Н.Непейвода "Прикладная логика", Новосибирск, издательство НГУ 2000.

Ну не теоретик я И методологию не учил

А ее и учить не нужно. И методология к языку не имеет отношения, это язык может быть более или менее пригоден для методологии.

...>>Переписать код так, чтобы этой проблемы не возникало.


P>Так у меня никакой проблемы и не возникает. Похоже она возникает у тех кто пытается переписать код в соответствии с "правильным теоретическим проектированием".


Это не вопрос проектирования вообще. Все сводится к изменению алгоритма или даже реализации алгоритма.
Re[7]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 07:17
Оценка:
Здравствуйте Patalog, Вы писали:

P>Только к чему все это? Неужели "интуиционистская логика и естественный вывод" так часто применяется в кодировании? Может я тоже ее применяю, но просто не знаю об этом?


Не непосредственно. За любым языком стоит некоторая теория. Эмпирическое наблюдение, не претендующее на строгость и полноту: удобство языка прямо пропорционально силе теории, стоящей за ним. А естественный вывод я взял только потому, что для него теорема доказывается короче всего.

P>Pls, обьясни поподробней. Если подкинешь ссылки, будет просто Только, как говориться, для чайников.


В электронном виде мало чего есть. Так что могу посоветовать только

Н.Н.Непейвода "Прикладная логика", Новосибирск, издательство НГУ 2000.

Ну не теоретик я И методологию не учил

А ее и учить не нужно. И методология к языку не имеет отношения, это язык может быть более или менее пригоден для методологии.

...>>Переписать код так, чтобы этой проблемы не возникало.


P>Так у меня никакой проблемы и не возникает. Похоже она возникает у тех кто пытается переписать код в соответствии с "правильным теоретическим проектированием".


Это не вопрос проектирования вообще. Все сводится к изменению алгоритма или даже реализации алгоритма.
Re[12]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 07:27
Оценка:
Здравствуйте Sergey, Вы писали:

S>Оно, конечно, не слишком сложно чего-то доказать, если оппоненты даже со способом записи доказательства не знакомы. Вот я, например, слабо себе представляю, что именно подразумевается под написанием программ на C++ в стиле схем Янова.


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

А если бы речь шла о записи изначально С++'ной программы на языке схем Янова, тогда о каком-таком goto (и вреде) идет речь? Об отсылающей полускобке? Или об условная полускобке? И вообще, тогда речь надо вести не о вреде goto, а о вреде схем Янова, потому как нормальный программист в этих кракозябрах нифига не поймет

Почему? Если данные глобальны и преобразования этих данных тоже глобальны, то функция, использующая goto, читабельна даже более, чем соответствующая структурная.

S>А вообще, у оператора goto есть одна неприятная особенность — он потенциально может передать управление куда угодно, "вверх" или "вниз", в отличие от return или break. Струкутурно программа написана или как-то иначе, роли не играет — тупо увеличивается время на поиск метки. Чеолвек мыслит в основном идиомами, а неоправданное применение goto эти идиомы разбивает (оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup).


На самом деле, упоминание схем Янова было только в связи с безаппеляционным заявлением "goto considered harmful".
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 07:29
Оценка:
Здравствуйте m.a.g., Вы писали:

[skip]

...>В электронном виде мало чего есть. Так что могу посоветовать только


...>Н.Н.Непейвода "Прикладная логика", Новосибирск, издательство НГУ 2000.


Thanks.

...>Ну не теоретик я И методологию не учил


...>А ее и учить не нужно. И методология к языку не имеет отношения, это язык может быть более или менее пригоден для методологии.


...>>>Переписать код так, чтобы этой проблемы не возникало.


P>>Так у меня никакой проблемы и не возникает. Похоже она возникает у тех кто пытается переписать код в соответствии с "правильным теоретическим проектированием".


...>Это не вопрос проектирования вообще. Все сводится к изменению алгоритма или даже реализации алгоритма.


В одном из ответов http://www.rsdn.ru/forum/message.asp?mid=60994&amp;only
Автор: Patalog
Дата: 06.06.02
я уже описал проблему (применительно к тому примеру который я приводил). Посмотри, может предложишь другой алгоритм, кроме тупого перебора? Реализацию уже предложил Vi2, по этому поводу я уже высказался.
Почетный кавалер ордена Совка.
Re[2]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 07:37
Оценка:
Здравствуйте Whisperer, Вы писали:

W>Ау знатоки программирования :wow: может вы другие темы смотреть будете и помогать желающим, а

W>вы обсасываете старую избитую тему (вчем прикол — поговорить, для этого chat существует).
W>Я смотру если появляется хороший вопрос — ответов или 0 или <10 . Зато на такие темы вы кидаетсесь
W>как голодные ... (извеняюсь вырвалось). И необежайтесь если я неправ. Мне здесь тоже помогали.
W>Но активность — только из-за таких тем. :user:

Ну надо же как-то развлекаться? Мы вот как-то развлекались над фразой "кошка Мебиуса — это кошка, которая гуляет сама по себе". Где-то час после обеда пытались представить, как могла бы выглядеть "Кошка Мебиуса"... :)))
Голь на выдумку хитра, однако...
Re[9]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 07:42
Оценка:
Здравствуйте Patalog, Вы писали:

...>>Это не вопрос проектирования вообще. Все сводится к изменению алгоритма или даже реализации алгоритма.


P>В одном из ответов http://www.rsdn.ru/forum/message.asp?mid=60994&amp;only
Автор: Patalog
Дата: 06.06.02
я уже описал проблему (применительно к тому примеру который я приводил). Посмотри, может предложишь другой алгоритм, кроме тупого перебора? Реализацию уже предложил Vi2, по этому поводу я уже высказался.


Да. Похоже, что в данном случае один черт. Но проблема это классическая — называется "exception с повторением" — возврат в точку ошибки после ее исправления. Стандартная схема эмуляции с помощью обычных исключений:

for(;;)
{
   try
   {
       action();
       break;
   }
   catch(/*what you want*/)
   {
   }
}
Re[13]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 06.06.02 07:50
Оценка:
Здравствуйте m.a.g., Вы писали:

S>>Оно, конечно, не слишком сложно чего-то доказать, если оппоненты даже со способом записи доказательства не знакомы. Вот я, например, слабо себе представляю, что именно подразумевается под написанием программ на C++ в стиле схем Янова.


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


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

...>А если бы речь шла о записи изначально С++'ной программы на языке схем Янова, тогда о каком-таком goto (и вреде) идет речь? Об отсылающей полускобке? Или об условная полускобке? И вообще, тогда речь надо вести не о вреде goto, а о вреде схем Янова, потому как нормальный программист в этих кракозябрах нифига не поймет :)


...>Почему? Если данные глобальны и преобразования этих данных тоже глобальны, то функция, использующая goto, читабельна даже более, чем соответствующая структурная.


Я так понял, подразумевается ровно одна функция (main)? Тогда абсолютно никакой разницы между локальными и глобальным данными, в рамках С/С++ и обсуждаемой проблемы, нет. И необоснованное использование goto так же вредно, как и в других случаях.

S>>А вообще, у оператора goto есть одна неприятная особенность — он потенциально может передать управление куда угодно, "вверх" или "вниз", в отличие от return или break. Струкутурно программа написана или как-то иначе, роли не играет — тупо увеличивается время на поиск метки. Чеолвек мыслит в основном идиомами, а неоправданное применение goto эти идиомы разбивает (оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup).


...>На самом деле, упоминание схем Янова было только в связи с безаппеляционным заявлением "goto considered harmful".


Угу, типа "в огороде бузина, в Киеве дядька" :))
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 07:55
Оценка:
Здравствуйте m.a.g., Вы писали:

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


...>>>Это не вопрос проектирования вообще. Все сводится к изменению алгоритма или даже реализации алгоритма.


P>>В одном из ответов http://www.rsdn.ru/forum/message.asp?mid=60994&amp;only
Автор: Patalog
Дата: 06.06.02
я уже описал проблему (применительно к тому примеру который я приводил). Посмотри, может предложишь другой алгоритм, кроме тупого перебора? Реализацию уже предложил Vi2, по этому поводу я уже высказался.


...>Да. Похоже, что в данном случае один черт. Но проблема это классическая — называется "exception с повторением" — возврат в точку ошибки после ее исправления. Стандартная схема эмуляции с помощью обычных исключений:


...>
...>for(;;)
...>{
...>   try
...>   {
...>       action();
...>       break;
...>   }
...>   catch(/*what you want*/)
...>   {
...>   }
...>}
...>


Не совсем понял, как это прикрутить в моем случае?
И потом, при больших итерациях, накладые расходы на исключения могу оказаться критичными. Правда это из более другой области.
Почетный кавалер ордена Совка.
Re[12]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 07:58
Оценка:
Здравствуйте VladD2, Вы писали:

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


P>>И не только меня. А если на этапе эксплуатации обнаружится не критическая ошибка, то баги перековываются в фичи


VD>Вот именно так (судя по коду) думают многие программеры из MS. И именно из-за такого отношения в ворде вот уже 4 версии подряд сидят один и теже глюки.


Есть такое... Попробуйте в Word ввести "уточнение наличия запасов м.с.;" — интересно, как ваш Word на это отреагирует?

VD>Приятно только одно... Так хамить могут только очень богатые контры. Маленьким это грозит разорением. Вот Гупта не смогла вовремя переписать энжин своего SQLBase и нету боьше гупты.


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

P>>ЗЫж Что будут делать те "бедняги" меня нисколько не волнует, ибо в человеколюбии замечен не был. Да и самому не раз приходилось оказываться в такой ситуации. Хотя все зависит от ситуации.


VD>Ну, кичись, кичись. По крайней мере когда в следующий раз попадешь в эту шкуру, будешь вспоминать.


P>>ЗЗЫж Вот я и говорю, после ваших ответов у меня складывается впечатление, что все ето замечательное "граммотное структурное программирование" нужно людям дабы править баги после релиза.


P>>А не проще то время, которое нужно чтобы каждый чих обернуть в "объектную обертку" (sorry за тафтологию), пытаться вместо одного goto городить кучу if'ов\флагов\и т.д. потратить на то чтбы просто нормально написать\отладить.


VD>Если было проще, то IT и я сдесь не матерились бы. Он тебе уже сказал, что именно такой подход как ты описываешь тормозит развитие этого сайта. Да и вранье это, что создание оберток замедляет процесс разработки. В программе 10-15 типов ресурсов которые нужно контролировать. Для 70% обертки уже есть. Так что из года ты убьешь на это занятие две недели. Зато потом, тебе не придется убивать кучу времени на встраивания такого же кода после меток от goto и отлаживать каждое такое место. Не придется так же и следить за последовотельностю освобождения этих ресурсов.


Поддерживаю...

P.S. Если кто-нибудь думает, что я подлизываюсь к Vlad-у — это не так. Могу сказать, что с некоторыми статьями на optim.ru я несогласен...
Голь на выдумку хитра, однако...
Re[13]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 06.06.02 08:02
Оценка:
Здравствуйте The Lex, Вы писали:

TL> Есть такое... Попробуйте в Word ввести "уточнение наличия запасов м.с.;" — интересно, как ваш Word на это отреагирует?


да в общем как всега — вывел на экран буковки. И ничего более... А в чем прикол?
Re[16]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 08:03
Оценка:
Здравствуйте Sergey, Вы писали:

S>Не, не надо путать причину со следствием. Тут не готу у человека отбирать надо, а конкретно дать ему по башке, чтоб выучил новый язык.


Я всегда считал, что для того чтобы выучить новый язык, необходимо научиться думать на нем, мыслить его категориями. Разве не так?
Голь на выдумку хитра, однако...
Re[14]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 08:11
Оценка:
Здравствуйте LeonGorbachev, Вы писали:

LG>Здравствуйте The Lex, Вы писали:


TL>> Есть такое... Попробуйте в Word ввести "уточнение наличия запасов м.с.;" — интересно, как ваш Word на это отреагирует?


LG>да в общем как всега — вывел на экран буковки. И ничего более... А в чем прикол?


У меня:
Microsoft Word 2000 (9.0.3821 SR-1)
Microsoft Windows NT Server 4.00.1381

Насчет систем проверки орфографии точно не скажу — похоже все дело в них. Но виснет напрочь... Правда только Word — NT остается в здравии...
Голь на выдумку хитра, однако...
Re[17]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 06.06.02 08:14
Оценка:
Здравствуйте The Lex, Вы писали:

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


S>>Не, не надо путать причину со следствием. Тут не готу у человека отбирать надо, а конкретно дать ему по башке, чтоб выучил новый язык.


TL>Я всегда считал, что для того чтобы выучить новый язык, необходимо научиться думать на нем, мыслить его категориями. Разве не так?


Так, но причем здесь это? Разве запрет на использование goto заставит думать новыми категориями? В данном случае (для очистки ресурсов) в С есть другие средства, например, лесенка if'ов. Скорее переучиваемый прибегнет к ним, чем к классам-оберткам. Так что запрет на использование goto — полумеры. Раз уж мы говорим о коде в ATL, то налицо или упорное нежелание людей, его писавших, переучиваться, поскольку писался код именно под С++, или применение методики программирования, известной как Copy'n'Paste.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[18]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 08:25
Оценка:
Здравствуйте Sergey, Вы писали:

S>Здравствуйте The Lex, Вы писали:


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


S>>>Не, не надо путать причину со следствием. Тут не готу у человека отбирать надо, а конкретно дать ему по башке, чтоб выучил новый язык.


TL>>Я всегда считал, что для того чтобы выучить новый язык, необходимо научиться думать на нем, мыслить его категориями. Разве не так?


S>Так, но причем здесь это? Разве запрет на использование goto заставит думать новыми категориями?


Запрет на использование родного языка на уроках иностранного широко применяется и, судя по всему, весьма эффективен.

S>В данном случае (для очистки ресурсов) в С есть другие средства, например, лесенка if'ов. Скорее переучиваемый прибегнет к ним, чем к классам-оберткам. Так что запрет на использование goto — полумеры. Раз уж мы говорим о коде в ATL, то налицо или упорное нежелание людей, его писавших, переучиваться, поскольку писался код именно под С++, или применение методики программирования, известной как Copy'n'Paste.


Ну, теперь мы начинаем сваливаться в сторону технологий изучения языков, языков программирования в т.ч.
Голь на выдумку хитра, однако...
Re[37]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 08:30
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Да. Универсальность понятие растяжимое. Было бы здорово иметь средство автоматизирующее процесс создания любого ПО, но пока этого нет. Успех достигнут только в проектировании БД. Я же хочу иметь нечто, что поможет не только проектировать но и автоматически реализовывать. Пусть даже в узкой области.


Причем в проектировании реляционных баз данных, насколько я знаю...
Голь на выдумку хитра, однако...
Re[11]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 08:39
Оценка:
Здравствуйте Patalog, Вы писали:

...>>Да. Похоже, что в данном случае один черт. Но проблема это классическая — называется "exception с повторением" — возврат в точку ошибки после ее исправления. Стандартная схема эмуляции с помощью обычных исключений:


...>>
...>>for(;;)
...>>{
...>>   try
...>>   {
...>>       action();
...>>       break;
...>>   }
...>>   catch(/*what you want*/)
...>>   {
...>>   }
...>>}
...>>


P>Не совсем понял, как это прикрутить в моем случае?


Посмотреть на проблему с другой стороны — не "выполнить проверку", а "повторять проверку, пока не окажется, что все в порядке".

P>И потом, при больших итерациях, накладые расходы на исключения могу оказаться критичными. Правда это из более другой области.
Re[13]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 08:42
Оценка:
Здравствуйте The Lex, Вы писали:

[skip]

TL>Вот и я о том же. И насчет постоянного добавления новых фич тоже. Может конечно сфера деятельности компании Patalog-а столь специфична, что этого не требуется, только что-то я в этом сомневаюсь. Вы уж меня простите, господин Patalog.


Не прощу :)
Новые фичи добавляются, но не постоянно. В одном из ответов я уже пытался объяснить почему. И ссылку на нашу контору давал. Так что не сомневайся ;)

Если кто еще не понял, "девушка в железном ящичке" — гипербола, сродни материальной точке и "модели сферической операционной системе в вакууме". Этим я хотел только показать несостоятельность mintenance в этом случае, с точки зрения добавления новых функций.
Вы же пытаетесь доказать, что применение goto _неизбежно_ приведет к "монолитности", ошибкам и еще черт знает к чему. И что программу будет _совершенно_ невозможно читать\отлаживать\править. То, что использовать goto "где попало" неправильно — я с этим никогда не сомневался. И я этого не делаю.

[Лирика]
Например, у нас скоро планируется переход на другое железо. При этом изменится форма представления сигналов и интерфейс к железяке. Форма представления изменится абсолютно безболезненно, ибо этого стоило ожидать и изначально закладывалась такая возможность. А вот с железкой хуже. Переделывать придется все (или почти все). И не потому, что этого не ожидалось, просто в данном случае предсказать и спроектировать проект так, чтобы учесть эти изменения — нельзя (ну или это просто мы не смогли). Когда в последний день решается вопрос — ISA\PCI\USB\COM\LPT и т.д. я не знаю как это предсказать, поскольку архитектура _сильно_ будет зависеть от аппаратной части. Почему вопрос решается в последний день — вопрос не ко мне, у железячников свои заморочки. Думается они еще сильно завязаны на производителей\поставщиков компонентов. Ибо когда возникает вопрос один контроллер либо более другой, решается по большей части в пользу стоимости оного, сроков доставки оного (помниться max срок был 1-год), стоимости обвязки оноого и т.д.

[skip]

VD>>Если было проще, то IT и я сдесь не матерились бы. Он тебе уже сказал, что именно такой подход как ты описываешь тормозит развитие этого сайта. Да и вранье это, что создание оберток замедляет процесс разработки. В программе 10-15 типов ресурсов которые нужно контролировать. Для 70% обертки уже есть. Так что из года ты убьешь на это занятие две недели. Зато потом, тебе не придется убивать кучу времени на встраивания такого же кода после меток от goto и отлаживать каждое такое место. Не придется так же и следить за последовотельностю освобождения этих ресурсов.


TL>Поддерживаю... :user:


TL>P.S. Если кто-нибудь думает, что я подлизываюсь к Vlad-у ;) — это не так. :)) Могу сказать, что с некоторыми статьями на optim.ru я несогласен... :shuffle:


Для ресурсов я тоже обертки использую, так что давай подлизываться вместе :)
Почетный кавалер ордена Совка.
Re[20]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 08:45
Оценка:
Здравствуйте Sergey, Вы писали:

S>Демагогия...


Ну, я уже высказал кому-то свое мнение (я читаю тему в "плоском" режиме), что вся эта тема вроде как разминка для ума для уважаемых господ программистов (а также разработчиков и всех, кого я еще не упомянул).

TL>> Ну, теперь мы начинаем сваливаться в сторону технологий изучения языков, языков программирования в т.ч.


S>Ну дык! С самого начала к этому шло


Похоже на то...
Голь на выдумку хитра, однако...
Re[12]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 08:54
Оценка:
Здравствуйте m.a.g., Вы писали:

[skip]

P>>Не совсем понял, как это прикрутить в моем случае?


...>Посмотреть на проблему с другой стороны — не "выполнить проверку", а "повторять проверку, пока не окажется, что все в порядке".


Ну, может быть к вопросу о подборе паролей это прикрутить и можно...
То есть ты предлагаешь сгенерить файловую систему, залить ее на болванку, попросить юзера воткнуть ее в сидюк и при возникновении исключения повторить все заново?
Или я опять недопонял? Прошу, объясни подробнее, как? Поглядеть можно много куда, вопрос вполне конкретный: при несоответствии идентификатора заданным критериям предоставить пользователю возможность исправить ошибку. При попытке исправить проверить заново. Все. Если тебе не сильно влом, перепиши кусок, который я предлагал к рассмотрению, с использованием метода "повторять проверку, пока не окажется, что все в порядке".
Почетный кавалер ордена Совка.
Re[14]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 09:03
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте The Lex, Вы писали:


P>[skip]


TL>>Вот и я о том же. И насчет постоянного добавления новых фич тоже. Может конечно сфера деятельности компании Patalog-а столь специфична, что этого не требуется, только что-то я в этом сомневаюсь. Вы уж меня простите, господин Patalog.


P>Не прощу

P>Новые фичи добавляются, но не постоянно. В одном из ответов я уже пытался объяснить почему. И ссылку на нашу контору давал. Так что не сомневайся

Да я в общем-то не очень сомневаюсь. Я кое-как представляю себе, что такое сертификация...

P>Если кто еще не понял, "девушка в железном ящичке" — гипербола, сродни материальной точке и "модели сферической операционной системе в вакууме". Этим я хотел только показать несостоятельность mintenance в этом случае, с точки зрения добавления новых функций.

P>Вы же пытаетесь доказать, что применение goto _неизбежно_ приведет к "монолитности", ошибкам и еще черт знает к чему. И что программу будет _совершенно_ невозможно читать\отлаживать\править. То, что использовать goto "где попало" неправильно — я с этим никогда не сомневался. И я этого не делаю.

Уф... Давайте забудем об этом бедном goto! Хорошо? Мы уже говорим не столько не совсем о нем, сколько совсем не о нем. Мы (конкретно с вами) больше обсуждаем рациональность написания "монолитного кода" против "структуированного кода".

Я тут удалил часть Вашего сообщения. Вы писали о проблемах взаимодействия с железачниками. Тут по большей степени организационные проблемы. Но вот "архитектура _сильно_ будет зависеть от аппаратной части" — как это может быть? Если эти слова относятся к чему-то довольно низкоуровневому — это да. Но даже в этом лучае какие-то общие принципы должны наследоваться, иначе придется переделывать всю систему. Причем каждый раз, как только железячникам взбредет в голову что-то новое.

VD>>>Если было проще, то IT и я сдесь не матерились бы.

VD>>>...

TL>>Поддерживаю...


TL>>P.S. Если кто-нибудь думает, что я подлизываюсь к Vlad-у — это не так. Могу сказать, что с некоторыми статьями на optim.ru я несогласен...


P>Для ресурсов я тоже обертки использую, так что давай подлизываться вместе


Вы считаете он это оценит? Он тут намекал, что ему мол кодеры нужны...
Голь на выдумку хитра, однако...
Re[15]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 06.06.02 09:30
Оценка:
Здравствуйте The Lex, Вы писали:

[skip]

TL>Да я в общем-то не очень сомневаюсь. Я кое-как представляю себе, что такое сертификация...

На мой взгляд, лучше бы и не представлять. И забыть об этом как о страшном сне.

[skip]

TL>Уф... Давайте забудем об этом бедном goto! Хорошо? Мы уже говорим не столько не совсем о нем, сколько совсем не о нем. Мы (конкретно с вами) больше обсуждаем рациональность написания "монолитного кода" против "структуированного кода".


Здесь я думаю обсуждать нечего, преимущество 2-го очевидны. В общем случае. За некоторыми исключениями, вызвынными причинами организационного характера. Как говорится, "А сказали бы им вечером в пятницу...". Я говорю о том, что иногда приходится попускаться высокими материями, и писать как придется, главное быстрее и "шоб работало", надеясь, что потом не придется править. Времени на хорошее проетирование просто может не быть. Но это исключение.

Я просто пытаюсь доказать, что все и вся грести под одну гребенку не стоит. Как и делать безаппеляционные заявления насчет ламеров и высококлассных программистов.

TL>Я тут удалил часть Вашего сообщения. Вы писали о проблемах взаимодействия с железачниками. Тут по большей степени организационные проблемы. Но вот "архитектура _сильно_ будет зависеть от аппаратной части" — как это может быть? Если эти слова относятся к чему-то довольно низкоуровневому — это да. Но даже в этом лучае какие-то общие принципы должны наследоваться, иначе придется переделывать всю систему. Причем каждый раз, как только железячникам взбредет в голову что-то новое.


А вот именно так оно и есть. Общие принципы несомненно соблюдаются, и переделывать _всю_ систему пока не приходилось. Обычно переделывается _вся_ интерфейсная часть (я имею в виду как низкоуровневую — драйвера, так и интерфейс с драйверами /в меньшей степени, ибо это более или менее можно обобщить/).

[skip]

P>>Для ресурсов я тоже обертки использую, так что давай подлизываться вместе


TL>Вы считаете он это оценит? Он тут намекал, что ему мол кодеры нужны...


[с надеждой] А може таки оценит?
Почетный кавалер ордена Совка.
Re[13]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 06.06.02 10:19
Оценка:
Здравствуйте Patalog, Вы писали:

...>>Посмотреть на проблему с другой стороны — не "выполнить проверку", а "повторять проверку, пока не окажется, что все в порядке".


P>Ну, может быть к вопросу о подборе паролей это прикрутить и можно...

P>То есть ты предлагаешь сгенерить файловую систему, залить ее на болванку, попросить юзера воткнуть ее в сидюк и при возникновении исключения повторить все заново?
Зачем же так глобально?

P>Или я опять недопонял? Прошу, объясни подробнее, как? Поглядеть можно много куда, вопрос вполне конкретный: при несоответствии идентификатора заданным критериям предоставить пользователю возможность исправить ошибку. При попытке исправить проверить заново. Все. Если тебе не сильно влом, перепиши кусок, который я предлагал к рассмотрению, с использованием метода "повторять проверку, пока не окажется, что все в порядке".




for(int nerrs = 1;; ++nerrs)
{
    try
    {
        CheckDuplicates(pRecord1, pRecord2);
        break;
    }
    catch(DuplicateFound& df)
    {
        if(pCheckControl->DoControl(df) == CCB_RES_ABORT) return nerrs;
    }
}

...

void CheckDuplicates(SDirectoryRecord* dir, SDirectoryRecord* curr)
{
    for(SDirectoryRecord* i = dir->m_pFirstRecord; i; i = dir->m_pNextDirectory)
        if(i != curr && curr->m_nLevel == i->m_nLevel && !CompareRecord(curr, i, nType))
            throw DuplicateFound(reinterpret_cast<long>(curr), reinterpret_cast<long>(i));
}


разумеется, слегка изменив pCheckControl->DoControl.

В этом коде весь CheckDuplicates рассматривался как атомарный. Если же атомарна только операция сравнения записи, то можно просто пронести try/catch внутрь for.
Re[12]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 12:11
Оценка:
Здравствуйте Patalog, Вы писали:

P>Vlad, а ты не думаешь, что изменение переменной цикла внутри цикла вешь более взрывоопасная, чем goto?


Нет. Не думаю. Это логика программы. К тому же удален ненужный цикл, так что читать такой код проще. Я бы для решения подобной задачи использовал итератор, и код стал бы еще проще и понятнее. Вариант с do тоже приемлем, но goto особенно в сочетании со скрытими граблями for-а, на которые я наткнулся в первый раз.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Выйти из двух циклов сразу
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 06.06.02 12:24
Оценка:
Ну поскольку в эту ветку больше гадят, чем пишут, я тоже нагажу

Никаких goto
Хотя, поскольку этому коду уже два года, наверное можно что-то причесать.
В частности return изнутри try{}catch — они жрут много кода

HRESULT TDBPropSets::GetPropertyInfo(ULONG cPropertyIDSets,
                                     const DBPROPIDSET rgPropertyIDSets[],
                                     ULONG *pcPropertyInfoSets,
                                     DBPROPINFOSET **prgPropertyInfoSets,
                                     OLECHAR **ppDescBuffer)
{
 //сначало инициализируем указатели на возвращаемые буферы
 if(pcPropertyInfoSets!=NULL)
  *pcPropertyInfoSets=0;

 if(prgPropertyInfoSets!=NULL)
  *prgPropertyInfoSets=NULL;

 if(ppDescBuffer)
  *ppDescBuffer=NULL;

 //теперь проверяем корректность аргументов
 if(cPropertyIDSets!=0 && rgPropertyIDSets==NULL)
  return E_INVALIDARG;

 if(pcPropertyInfoSets==NULL || prgPropertyInfoSets==NULL)
  return E_INVALIDARG;

 ULONG cSets=0;
 bool  UseSpecialGuid=false;

 if(cPropertyIDSets==0)
  cSets=GetItemsInContainer(); //все наборы
 else
 {
  //определяем - это явные идентификаторы наборов или идентификаторы групп
  UINT cGUID=0,cSpecialGUID=0;
  for(UINT iIDSet=0;iIDSet!=cPropertyIDSets && !(cGUID && cSpecialGUID);iIDSet++)
  {
   if(TestGUID(rgPropertyIDSets[iIDSet].guidPropertySet)!=is_special_guid)
    cGUID++;
   else
   {
    cSpecialGUID++;
    cSets+=GetPropSetCount(rgPropertyIDSets[iIDSet].guidPropertySet);
   }
  }

  if(cGUID && cSpecialGUID) //одновременная передача иденификаторов групп и
  {
   ODS_LEVEL_3("Cant't query prop info for special guaid's and propset guid's")
   return E_INVALIDARG;     //наборов запрещена по стандарту
  }

  UseSpecialGuid=cSpecialGUID!=0;

  if(!UseSpecialGuid)
   cSets=cPropertyIDSets; //возвращаем только то, что просили.

 }//else - мы получили не пустой массив rgPropertyIDSets

 if(cSets==0)
  return NOERROR;

 HRESULT hr=NOERROR;

 DBPROPINFOSET* pPropSet=CoTaskAllocator<DBPROPINFOSET>().allocate(cSets);

 if(pPropSet==NULL) return E_OUTOFMEMORY;

 ULONG           cNotSupported=0;

 _OLE_TRY_
 {
   TDBPropertySet*   pPropertySet;
   t_vector<string>  Descriptions;

   if(cPropertyIDSets==0)//возвращаем все наборы
   {
    for(UINT iSet=0;hr==NOERROR && iSet!=cSets;iSet++)
    {
     assert(iSet!=GetItemsInContainer());
     
     pPropSet[iSet].guidPropertySet=(*this)[iSet]->m_Guid;
     hr=(*this)[iSet]->Get(NULL,pPropSet[iSet],
                           ppDescBuffer?(&Descriptions):NULL,cNotSupported);
    }
   }
   else
   if(!UseSpecialGuid) // возвращаем только указанные наборы
   {
    //мы получили список идентификаторов наборов
    for(UINT iSet=0;hr==NOERROR && iSet!=cSets;iSet++)
    {
     pPropSet[iSet].guidPropertySet=rgPropertyIDSets[iSet].guidPropertySet;

     pPropertySet=Find(rgPropertyIDSets[iSet].guidPropertySet);

     if(pPropertySet!=NULL)
     {
      hr=pPropertySet->Get(&rgPropertyIDSets[iSet],pPropSet[iSet],
                           ppDescBuffer?(&Descriptions):NULL,cNotSupported);
      continue;
     }

     //Набор не поддерживается. Отмечам все свойства как не поддерживаемые.
     ODS_LEVEL_3("ERROR: GetPropInfo "<<clsid_to_string(rgPropertyIDSets[iSet].guidPropertySet));

     if(rgPropertyIDSets[iSet].cPropertyIDs==0)//а ничего и не требовалось :)
      continue;

     pPropSet[iSet].rgPropertyInfos=
      CoTaskAllocator<DBPROPINFO>().allocate(rgPropertyIDSets[iSet].cPropertyIDs);

     if(pPropSet[iSet].rgPropertyInfos==NULL)
     {
      hr=E_OUTOFMEMORY;
      continue;
     }

     pPropSet[iSet].cPropertyInfos=rgPropertyIDSets[iSet].cPropertyIDs;
     for(UINT iProp=0;iProp!=rgPropertyIDSets[iSet].cPropertyIDs;iProp++)
     {
      pPropSet[iSet].rgPropertyInfos[iProp].dwPropertyID=rgPropertyIDSets[iSet].rgPropertyIDs[iProp];
      pPropSet[iSet].rgPropertyInfos[iProp].dwFlags=DBPROPFLAGS_NOTSUPPORTED;
     }
    }//for iSet
   }//!UseSpecialGuid - возвращаем только указанные наборы
   else
   {// возвращаем наборы свойств которые попадают под SpecialGuid
    // cSets - общее количество наборов которые попали под критерий выборки
    // Если в группу не попали наборы - она игнорируется

    ULONG iPropSet=0;//индексация внутри pPropSet

    //перечисляем все группы
    for(UINT iIDSet=0;hr==NOERROR && iIDSet!=cPropertyIDSets;iIDSet++)
    {
     //последовательный просмотр всех наборов для проверки попадания в группу
     for(ULONG iSet=0;hr==NOERROR && iSet!=GetItemsInContainer();iSet++)
     {
      if((*this)[iSet]->IsSpecialGuid(rgPropertyIDSets[iIDSet].guidPropertySet))
      {
       assert(iPropSet>=0 && iPropSet<cSets);

       pPropSet[iPropSet].guidPropertySet=(*this)[iSet]->m_Guid;
       hr=(*this)[iSet]->Get(NULL,pPropSet[iPropSet++],
                             ppDescBuffer?(&Descriptions):NULL,cNotSupported);
      }
     }//iSet
    }//for iIDSet
   }//возвращение наборов из указанных групп (specialGuids)

   //*********************************************************************

   if(ppDescBuffer && (hr==NOERROR || hr==DB_S_ERRORSOCCURRED) && cSets!=0)
   {
    assert(pPropSet!=NULL);

    //производим привязку Descriptions
    ULONG CommonLength=Descriptions.GetItemsInContainer();//сразу сколько 0

    for(UINT i=0;i!=Descriptions.GetItemsInContainer();i++)
     CommonLength+=Descriptions[i].length();

    if(CommonLength==0)
    {
     //смотрим - сколько поддерживаемых свойств не имеют названий
     bool Stop=false;
     for(UINT iSet=0;!Stop && iSet!=cSets;iSet++)
      for(UINT iProp=0;!Stop && iProp!=pPropSet[iSet].cPropertyInfos;iProp++)
      {
       if(pPropSet[iSet].rgPropertyInfos[iProp].dwFlags!=DBPROPSTATUS_NOTSUPPORTED &&
          pPropSet[iSet].rgPropertyInfos[iProp].pwszDescription==NULL)
        Stop=true;
      }

     CommonLength+=Stop;//нужен по крайней мере 1 символ для неименованных элементов 
    }

    if(CommonLength!=0)
    {
     *ppDescBuffer=CoTaskAllocator<OLECHAR>().allocate(CommonLength);//инициализирует нулями

     if(*ppDescBuffer==NULL)
      hr=E_OUTOFMEMORY;
    }

    if(*ppDescBuffer!=NULL)  //была выделена память
    {
     //копируем дескрипторы в массив
     OLECHAR* pos=(*ppDescBuffer);
     UINT     index;   //индекс из pwszDescription (0 - нет строки)  
     UINT     str_len; //длина строки Descriptions[index-1]

     for(ULONG iSet=0;iSet!=cSets;iSet++) //обход всех наборов
     {
      for(ULONG iProp=0;iProp!=pPropSet[iSet].cPropertyInfos;iProp++)//обход всех свойств набора
      {
       if(pPropSet[iSet].rgPropertyInfos[iProp].dwFlags==DBPROPFLAGS_NOTSUPPORTED)
       {
        assert(pPropSet[iSet].rgPropertyInfos[iProp].pwszDescription==NULL);
        continue;
       }

       index=reinterpret_cast<UINT>(pPropSet[iSet].rgPropertyInfos[iProp].pwszDescription);

       if(index==0)
       {
        //указатель на последний символ - все равно он должен быть == L'\0'
        pPropSet[iSet].rgPropertyInfos[iProp].pwszDescription=(*ppDescBuffer)+CommonLength-1;
       }
       else
       {         //[1..GetItemsInContainer()]
        assert(index<=Descriptions.GetItemsInContainer());
                 //учитываем завершающий символ
        str_len=Descriptions[index-1].length()+1;

        assert(pos-(*ppDescBuffer)+str_len<=CommonLength); //проверка длины
                 //устанавливаем реальный указатель на строку
        pPropSet[iSet].rgPropertyInfos[iProp].pwszDescription=pos;

        //конвертируем вместе с последним символом
        ::MultiByteToWideChar(0,0,Descriptions[index-1].c_str(),str_len,pos,str_len);

        pos+=str_len;
       }//установка реального указателя

      }//for iPos
     }//for iSet
    }//память выделена успешно.
   }
 }
 _OLE_CATCHES_

 if(hr!=NOERROR && hr!=DB_S_ERRORSOCCURRED)
 {
  //произощел сбой - поэтому очищаем все, что мы создали
  //под символьный буфер ни чего не выделено (он выделяется последним)
  
  for(UINT iSet=0;iSet!=cSets;iSet++)
  {
   if(pPropSet[iSet].rgPropertyInfos!=NULL)
   {
    for(UINT iProp=0 ; iProp!=pPropSet[iSet].cPropertyInfos ; iProp++)
     ::VariantClear(&pPropSet[iSet].rgPropertyInfos[iProp].vValues);

    ::CoTaskMemFree(pPropSet[iSet].rgPropertyInfos);
   }
  }//for iSets

  ::CoTaskMemFree(pPropSet);
 }
 else // Работа прошла без приключений
 {
  *pcPropertyInfoSets=cSets;       //возвращаемые данные
  *prgPropertyInfoSets=pPropSet;

  if(hr==NOERROR && cNotSupported!=0) //что-то неподдерживается,
   hr=DB_S_ERRORSOCCURRED;            //конкретно - отмеченно в выходящей структуре
 }

 return hr;
}
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[7]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 12:53
Оценка:
Здравствуйте Patalog, Вы писали:

P>Так у меня никакой проблемы и не возникает. Похоже она возникает у тех кто пытается переписать код в соответствии с "правильным теоретическим проектированием".


Судя по твоему упорству проблема у тебя все же возникает. Только она не в неумении переписать..., а в твоей психологии. Тебе показали три варианта решающие твою пробему и более понятные окружающим, ты же все варианты назвал извращениями (не приведя ни одного аргумента).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 13:03
Оценка:
Здравствуйте Patalog, Вы писали:

P>Что, прямо таки весь код показывать? Так его достаточно много... Вообще ето код генерации isofs (Level 1, 2, 3 и Joilet Ext).


Весь не надо. Достаточно этой функции. Хотя размер приведенного тобой кода уже приближается к максимально допустимому для меня.

P>Проблема в чем, каждый идентификатор (имя файла, директории) должен соответствовать определенным критериям вышеупомянутых стандартов (типа того что имена файлов на одном уровне вложенности не должны совпадать, иметь определенную длину, ограничивается общая длина идентификаторов от корня и т.д.). При нарушении одного из критериев пользователю предоставляется возможность исправить ошибку (типа как Nero ругается, что имя длинной более 255 символов и предлагает сократить).


Т.е. Это интерактивная программа? Может быть тогда гумманнее (по отношению к пользователю) быбо бы создать список ошибок и предложить их исправить.

P>Кусок кода, который я привел проверяет идентификатор на уникальность на данном уровне вложенности. Для этого идентификатор сравнивается со всеми идентификаторами на данном уровне.


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

P>Если пользоватль решил отменить генерацию — ок, выходим, если игнорировать — ок, юзер знает что делает, продолжаем, если решил положиться на автоматическое исправление — ок, продолжаем (кстати в данной реализации игнорировать == автоматически исправлять), если же юзер все же внес исправленя необходимо вновь проверить новый идентификатор на соответствие.


В подобный алгоритмах предпочтения пользователя обычно учитываются введением переменной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: goto жил, goto жив, goto будет жить
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 06.06.02 13:29
Оценка:
Прочитал вот на dotsite — абзац "Простота использования"

----------
В C#, также как и в Visual Basic после каждого выражения case в блоке switch подразумевается break. И более не будет происходить странных вещей если вы забыли поставить этот break. Однако если вы действительно хотите чтобы после одного выражения case программа перешла к следующему вы можете переписать свою программу с использованием, например, оператора goto.
----------

Я полагаю, статью написал не дурак. Но зачем вот прямо так — серпом по ...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: goto жил, goto жив, goto будет жить
От: IT Россия linq2db.com
Дата: 06.06.02 13:35
Оценка:
Здравствуйте Коваленко Дмитрий, Вы писали:

КД>Я полагаю, статью написал не дурак. Но зачем вот прямо так — серпом по ...


Самое печальное, что это рекомендованный Микрософтом способ. Вместо того, чтобы сделать другой, ограниченный пределами switch оператор, они решили сэкономить и использовать для этого goto.
Если нам не помогут, то мы тоже никого не пощадим.
Re[31]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 14:35
Оценка:
Здравствуйте The Lex, Вы писали:

Давай на ты. Здесь так принято...

TL>По моему скромному мнению уже есть подобные прецеденты.


Я и не спорю. Только они или никуда не годные, или мало полезные.

TL> Далеко ходить не надо: что вы скажете насчет систем управления веб-контентом? САПР сайта.


Честно говоря законченные системы в этой области мне не нравятся.

TL>Кто сказал, что HTML/DHTML/ServerScripts — это не программирование?


Да никто вроде не говорил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 14:48
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте The Lex, Вы писали:

VD>Давай на ты. Здесь так принято...

Все время забываю. Рефлекс... Буду стараться...

TL>>По моему скромному мнению уже есть подобные прецеденты.


VD>Я и не спорю. Только они или никуда не годные, или мало полезные.


Я как раз и имел в виду системы управления веб-контентом. А вообще САПР ПО я представляю себе довольно смутно. Ну есть, конечно, некоторые

TL>> Далеко ходить не надо: что вы скажете насчет систем управления веб-контентом? САПР сайта.


VD>Честно говоря законченные системы в этой области мне не нравятся.


Мне тоже — они дает возможность избавиться от рутины, но ограничивают свободу. На RSDN таких нет?

TL>>Кто сказал, что HTML/DHTML/ServerScripts — это не программирование?


VD>Да никто вроде не говорил.


Влад, Вы... ах да... ты придираешься к словам...
Голь на выдумку хитра, однако...
Re[3]: Выйти из двух циклов сразу
От: Хитрик Денис Россия RSDN
Дата: 06.06.02 14:57
Оценка:
TL>Ну надо же как-то развлекаться? Мы вот как-то развлекались над фразой "кошка Мебиуса — это кошка, которая гуляет сама по себе". Где-то час после обеда пытались представить, как могла бы выглядеть "Кошка Мебиуса"...


Прикольно, но не по теме!
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re: 2All: Модерирование
От: Хитрик Денис Россия RSDN
Дата: 06.06.02 15:03
Оценка:
Ребята, я так мыслю, что темы новые либо уже открыты в других форумах, либо, если у кого осталось что-то невыясненным, открывайте в других (или в этом) форумах. Уже обсудили и goto, и работу в группе. Практически никто не пытался изменить тему своих сообщений, чтобы позволить остальным как-то сориентироваться в проблеме. Порицание вам, уважаемые.

P.S. Если что -- ставьте на голосование вопрос о необходимости форума "Философия программирования". В нём и будем собирать такие вот длинные темы Наполняемость темами, конечно будет низкая, зато в пределах топика такие флеймы затеваться будут!
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[18]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 15:07
Оценка:
Здравствуйте Аноним, Вы писали:

А>Во-первых, применение оптимизатора не дает увеличение скорости программы на порядок (десятичный порядок, по крайней мере). Во-вторых, моя фраза о разных задачах относилось к "А нагромаждение циклов... Мы как то обходится".


Ты это проверял? А я проверял. В 10 раз! Это средняя величина. Даже не средняя, а практически минимальная. Если используются все возможности оптимизатора по скорости, то бывает и больше. Без оптимизации компиляторы генерируют вообще убогий код. На него даже смотреть противно.

VD>>Значит плохо читал. А про флоат без CRT... Не просто можно но и очень даже ничего получаетя.

А>Нормально читал Там, если ты помнишь, про fp всего пара абзацов, которые кратко пересказать можно так: "Если вам надо использовать fp вычисления без CRT, сами разбирайтесь, какая функция что за собой тянет, мне влом этим заниматься".

Там написано, что ты лишаешся обработки ошибок типа переполнения, а в остальном достаточно определить одну глобальную переменную и все. Необходимые выкрутасы с делаются через automation API.

А>Да и совет линковаться с LIBC.LIB вполне однозначен — это ж просто использование части CRT.


Там объяснено, что многие функции CRT (а вернее ее стартап-код) не тянут и их можно смело использовать.

VD>>Это я тебе говорю, так как мы с БД без CRT работаем, а там флоаты частенько поадаются.

А>И что вы с ними делаете? Юзеру показываете? А логарифм взять?

Логорифм нам не нужен. Но если пондобится, то возмем фунцию и будем использовать. Мат-алгоритмы не должны цеплять стартап-код.

А>Что такое "настройки нет"?


Да это я ступил. Хотел сказать что наш код луче использует настройки ОС, т.е. региональные установки.

VD>>Мы пишим COM-библиотеки и нужно распространять их по сети.


А>Я не отрицаю, что есть класс задач, где CRT нафиг не нужна. Просто C++ без CRT — и не C++, и не C. И фиг его знает, что там после выхода очередного сервиспака глючить начнет.


Ну, дык когда у тебя 90% времени уходит на задачи в которых CRT вредно, то привыкаешь к программированию без него. Я же не призываю всех жить без CRT, я прсто говрю, что не нужно делать заявлений, что без него С++ не С++.

А>А начал использовать тяжеленный wxWindows и тоже не жалею


А это, что?

А>Если wsprintf еще можно хоть как-то замаскировать под sprintf, то с automation API этот номер не пройдет и код (вполне безразличная к операционке его часть) станет windows-only. Да и геморроя с ним на порядок больше, чем с sprintf и иже с ними.


А предствь себе какой может быть рынок сбыта для COM-объектов под Уних? А мы именно их делаем.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 15:46
Оценка:
Здравствуйте Коваленко Дмитрий, Вы писали:

КД>Ну поскольку в эту ветку больше гадят, чем пишут, я тоже нагажу


Здорово, но моно был бы лучше если бы ты разбил эту функцию на несколько по меньше.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 06.06.02 15:51
Оценка:
Здравствуйте The Lex, Вы писали:

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


GS>>Автоматизация программирования для предметной области. Мне такое не интересно. Хотя коммерчески может быть весьма успешным.


TL>По моему скромному мнению уже есть подобные прецеденты. Далеко ходить не надо: что вы скажете насчет систем управления веб-контентом? САПР сайта. Кто сказал, что HTML/DHTML/ServerScripts — это не программирование?


Ну, уж, во всяком случае, я этого не говорил. Это программирование, и САПР сайта (или генератор скриптов) — несколько более общая задача, чем САПР Корпоративная Информационная Система.
GS
Re[32]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 15:58
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте The Lex, Вы писали:


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


GS>>>Автоматизация программирования для предметной области. Мне такое не интересно. Хотя коммерчески может быть весьма успешным.


TL>>По моему скромному мнению уже есть подобные прецеденты. Далеко ходить не надо: что вы скажете насчет систем управления веб-контентом? САПР сайта. Кто сказал, что HTML/DHTML/ServerScripts — это не программирование?


GS>Ну, уж, во всяком случае, я этого не говорил. Это программирование, и САПР сайта (или генератор скриптов) — несколько более общая задача, чем САПР Корпоративная Информационная Система.


САПР сайта — это более общая задача, чем САПР КИС? А в чем особые отличия между сайтом и КИС?
Голь на выдумку хитра, однако...
Re[38]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 06.06.02 16:02
Оценка:
Здравствуйте The Lex, Вы писали:

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


VD>>Да. Универсальность понятие растяжимое. Было бы здорово иметь средство автоматизирующее процесс создания любого ПО, но пока этого нет. Успех достигнут только в проектировании БД. Я же хочу иметь нечто, что поможет не только проектировать но и автоматически реализовывать. Пусть даже в узкой области.


TL>Причем в проектировании реляционных баз данных, насколько я знаю...


Причем не в проектировании (оно не автоматизировано), а в кодогенерации скриптов физической модели (которые еще неплохо потом глазками прочесть и ручками поправить). Проектирование по-старому делается головой. Еще немного автоматизирована запись результатов поректирования в виде, пригодном для скриптогенерации.
GS
Re[15]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 16:03
Оценка:
Здравствуйте The Lex, Вы писали:

TL>>>P.S. Если кто-нибудь думает, что я подлизываюсь к Vlad-у — это не так. Могу сказать, что с некоторыми статьями на optim.ru я несогласен...


Дык в большинстве случаев мы их и не пишем. Даже на оборот стараемся привлекать авторов с разным мнением.

P>>Для ресурсов я тоже обертки использую, так что давай подлизываться вместе


TL>Вы считаете он это оценит?


О меня в приемную комиссию записали.
Господа не подумайте. Я не хочу никого оценивать. Я как и вы все высказываю свое мнение. Если кто-то со мною согласен, замечательно, если нет, ну, что же поспорим... глядишь у каждого появится кое-какие новые мысли.

TL>Он тут намекал, что ему мол кодеры нужны...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 06.06.02 16:26
Оценка:
Здравствуйте The Lex, Вы писали:

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


VD>>Здравствуйте The Lex, Вы писали:

VD>>Давай на ты. Здесь так принято...

TL>Все время забываю. Рефлекс... Буду стараться...


А ты представляй между собой и собеседником кружку с пивом. Такую граненую, из общепита, на пол литра, пиво с пеной, стенки запотели...
GS
Re[33]: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 06.06.02 16:30
Оценка:
Здравствуйте The Lex, Вы писали:

TL>САПР сайта — это более общая задача, чем САПР КИС? А в чем особые отличия между сайтом и КИС?


При писании САПРа КИС нужно гораздо рахговаривать с конечными пользователями, ограничения предметной области там сильнее, нет (меньше) возможности применять универсальные подходы.

Я так думаю...
GS
Re[34]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 16:38
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте The Lex, Вы писали:


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


VD>>>Здравствуйте The Lex, Вы писали:

VD>>>Давай на ты. Здесь так принято...

TL>>Все время забываю. Рефлекс... Буду стараться...


GS>А ты представляй между собой и собеседником кружку с пивом. Такую граненую, из общепита, на пол литра, пиво с пеной, стенки запотели...


Почему ты думаешь, что я в таком случае общаюсь "на ты"? Как раз в такой ситуации очень даже хорошо идет "Вы". А вот если у тебя под задницей несется асфальт со скоростью всего километров 30 в час, но до асфальта всего несколько сантиметров, и у твой "собеседник" вдруг подрезает тебя самым неприличным образом — вот тогда все выражения идут "на ты". Правда потом, обсуждая это дело за кружечкой пива, почему-то непременно хочется говорить "Вы" — расслабленно и спокойно, тихо и интеллигентно...
Голь на выдумку хитра, однако...
Re[34]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 06.06.02 16:54
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте The Lex, Вы писали:


TL>>САПР сайта — это более общая задача, чем САПР КИС? А в чем особые отличия между сайтом и КИС?


GS>При писании САПРа КИС нужно гораздо рахговаривать с конечными пользователями, ограничения предметной области там сильнее, нет (меньше) возможности применять универсальные подходы.


GS>Я так думаю...


Ну, тут я не могу разделить Вашу (Черт возьми!!! Мы ведь ведем интеллигентную беседу о высоких материях!!! Ну не могу я писать "ты"! Вы уж не обессудте... ) точку зрения. В моем понимании и первое и второе представлет собой информационную систему. Причем именно первое — т.е. сайт — как правило является более узкой сферой по сравнению с КИС. Часто сайт предназначет только для отображения информации, в то время как КИС — для ее сбора, хранения, обработки и т.д. и т.п. Причем во втором случае методы работы имеют довольно мощную теоретическую базу.

По-моему мы уж совсем отдаляемся от первоначальной темы...
Голь на выдумку хитра, однако...
Re[39]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 18:34
Оценка:
Здравствуйте George_Seryakov, Вы писали:

TL>>Причем в проектировании реляционных баз данных, насколько я знаю...


GS>Причем не в проектировании (оно не автоматизировано), а в кодогенерации скриптов физической модели (которые еще неплохо потом глазками прочесть и ручками поправить). Проектирование по-старому делается головой. Еще немного автоматизирована запись результатов поректирования в виде, пригодном для скриптогенерации.


По-моему, ты не прав. Автоматизировано не значит что труд человека полнстью исключен. Это занчит, что мне не нужно прогаммировать или страгать рубанком, чтобы выполнить ту или иную задачу. ERWin и Visio 2002 дают возможность проектировать в визуальном режиме. Причем они тесно интегрированы с СУБД и с их помощью можно развивать имеющиеся БД. Так что именно в проектировани. Я слышал что и Рэйшонал есть некий продукт который позволяет проектировать алгоритмы, но вроде он только с VB работает. Так что пока это все в зачаточном состоянии, но в будущем это очень даже можетс стать серьезной заменой кодированию. Как сейчас в отношении БД.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 06.06.02 19:05
Оценка:
Здравствуйте The Lex, Вы писали:

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


LG>>Здравствуйте The Lex, Вы писали:


TL>>> Есть такое... Попробуйте в Word ввести "уточнение наличия запасов м.с.;" — интересно, как ваш Word на это отреагирует?


LG>>да в общем как всега — вывел на экран буковки. И ничего более... А в чем прикол?


TL>У меня:

TL>Microsoft Word 2000 (9.0.3821 SR-1)
TL>Microsoft Windows NT Server 4.00.1381

TL>Насчет систем проверки орфографии точно не скажу — похоже все дело в них. Но виснет напрочь... Правда только Word — NT остается в здравии...

У мени Win XP и Word XP тоже виснет.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 19:44
Оценка:
Здравствуйте WolfHound, Вы писали:

TL>>>> Есть такое... Попробуйте в Word ввести "уточнение наличия запасов м.с.;" — интересно, как ваш Word на это отреагирует?


LG>>>да в общем как всега — вывел на экран буковки. И ничего более... А в чем прикол?


TL>>У меня:

TL>>Microsoft Word 2000 (9.0.3821 SR-1)
TL>>Microsoft Windows NT Server 4.00.1381

TL>>Насчет систем проверки орфографии точно не скажу — похоже все дело в них. Но виснет напрочь... Правда только Word — NT остается в здравии...

WH>У мени Win XP и Word XP тоже виснет.

А у меня нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.02 20:04
Оценка:
Здравствуйте Sergey, Вы писали:

S>...оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup.


Все здорово, то только для очистки ресурсов в С++ есть куда более надежный способ — создание оберток которые это делают автоматически. Вот и получается, что в современном С++ любое использование goto или имеет более эффективную замену, или приводит к нарушению структурированности логики.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 07.06.02 03:40
Оценка:
Здравствуйте VladD2, Вы писали:

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


[skip]

VD>Т.е. Это интерактивная программа? Может быть тогда гумманнее (по отношению к пользователю) быбо бы создать список ошибок и предложить их исправить.


Интерактивеностью занимается класс CProcessControl и, в частности, его метод DoControl. Т.е. между непосредственно интетрейсом юзера и реализацией алгоритма генерации cdfs есть еще одна прослойка, в которой можно сделать и список. На тот момент (~1,5 года назад) это было не нужно.

P>>Кусок кода, который я привел проверяет идентификатор на уникальность на данном уровне вложенности. Для этого идентификатор сравнивается со всеми идентификаторами на данном уровне.


VD>Такие вещи на порядок эффективнее делать через хэш-таблицы. При этом повторная проверка могла бы выглядеть простым циклом и занимала бы пару строк.


Не спорю. Может даже и сделаю. Я уже думал об этом, впринципе это лешко сделать. Но, как всегда руки не доходят.

P>>Если пользоватль решил отменить генерацию — ок, выходим, если игнорировать — ок, юзер знает что делает, продолжаем, если решил положиться на автоматическое исправление — ок, продолжаем (кстати в данной реализации игнорировать == автоматически исправлять), если же юзер все же внес исправленя необходимо вновь проверить новый идентификатор на соответствие.


VD>В подобный алгоритмах предпочтения пользователя обычно учитываются введением переменной.


А они так и учитываются, именно в прослойке, о которой я писал выше.
Почетный кавалер ордена Совка.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 07.06.02 03:51
Оценка:
Здравствуйте VladD2, Вы писали:

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


P>>Так у меня никакой проблемы и не возникает. Похоже она возникает у тех кто пытается переписать код в соответствии с "правильным теоретическим проектированием".


VD>Судя по твоему упорству проблема у тебя все же возникает. Только она не в неумении переписать..., а в твоей психологии. Тебе показали три варианта решающие твою пробему и более понятные окружающим, ты же все варианты назвал извращениями (не приведя ни одного аргумента).


А что упорство уже наказуемо? А проблема уже давно решена. Код уже достаточно давно работает, прекрасно модифицируется (первоначально была поддержка только Level 1, позднее добавились Level 2, 3 и Joilet).

Насчет вариантов —
_Мне_ эти варианты показались более непонятными, но извращениями я их не называл, не передергивай.
По варианту, который присла ты, я тебе ответил, что считаю изменение переменной цикла внутри цикла еще большими граблями, и еще более непонятным "окружающим". И макросами здесь не поможешь. Ибо макросы еще большие грабли. _Имхо_.
Вариант Vi2 (2-й) более хорош.
На 3-й вариант (от m.a.g) я вообще еще ничего не ответил.

ЗЫж А насчет "более понятные окружающим", еще раз повторюсь — отучаемся говорить за всех.
Почетный кавалер ордена Совка.
Re[17]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 07.06.02 03:53
Оценка:
Здравствуйте VladD2, Вы писали:

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


TL>>>>> Есть такое... Попробуйте в Word ввести "уточнение наличия запасов м.с.;" — интересно, как ваш Word на это отреагирует?


LG>>>>да в общем как всега — вывел на экран буковки. И ничего более... А в чем прикол?


TL>>>У меня:

TL>>>Microsoft Word 2000 (9.0.3821 SR-1)
TL>>>Microsoft Windows NT Server 4.00.1381

TL>>>Насчет систем проверки орфографии точно не скажу — похоже все дело в них. Но виснет напрочь... Правда только Word — NT остается в здравии...

WH>>У мени Win XP и Word XP тоже виснет.

VD>А у меня нет.


Виснет гад. На том же самом.
Почетный кавалер ордена Совка.
Re[16]: Выйти из двух циклов сразу
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.06.02 04:07
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте Коваленко Дмитрий, Вы писали:


КД>>Ну поскольку в эту ветку больше гадят, чем пишут, я тоже нагажу


VD>Здорово, но моно был бы лучше если бы ты разбил эту функцию на несколько по меньше.


Да и так стараюсь как могу
В последнее время рвет на очень длинные функции и громадные файлы, но не всегда удается их победить.

Кстати — тут вот проскальзала мысль (или музыкой навеяло?), что те кто использует goto — не врубаются в ... эээ процесс(?) выполнения программы. Так вот. Как много из тех, кто сюда написал, оборачивают реализацию каждого (COM-)интерфейсного метода ловушками исключений?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[17]: Выйти из двух циклов сразу
От: The Lex Украина  
Дата: 07.06.02 05:31
Оценка:
Здравствуйте VladD2, Вы писали:

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


TL>>>Насчет систем проверки орфографии точно не скажу — похоже все дело в них. Но виснет напрочь... Правда только Word — NT остается в здравии...

WH>>У мени Win XP и Word XP тоже виснет.

VD>А у меня нет.


А это потому, что у вас Word ручками без CRT переписан...
Голь на выдумку хитра, однако...
Re[13]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 07.06.02 05:49
Оценка:
Здравствуйте VladD2, Вы писали:

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


S>>...оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup.


VD>Все здорово, то только для очистки ресурсов в С++ есть куда более надежный способ — создание оберток которые это делают автоматически. Вот и получается, что в современном С++ любое использование goto или имеет более эффективную замену, или приводит к нарушению структурированности логики.


Мля, описка это была. Вместо С++ должно было быть С. Плюсы сами набрались :)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[19]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 07.06.02 07:35
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте Аноним, Вы писали:


А>>Во-первых, применение оптимизатора не дает увеличение скорости программы на порядок (десятичный порядок, по крайней мере). Во-вторых, моя фраза о разных задачах относилось к "А нагромаждение циклов... Мы как то обходится".


VD>Ты это проверял? А я проверял. В 10 раз! Это средняя величина. Даже не средняя, а практически минимальная. Если используются все возможности оптимизатора по скорости, то бывает и больше. Без оптимизации компиляторы генерируют вообще убогий код. На него даже смотреть противно.


В 10 раз? Смотря что за код, можно написать и так, что оптимизированный код в 100 раз быстрее будет. Может я пишу чего неправильно, или у меня компилятор неправильный, но вот сейчас проверил на днях написанный критичный по быстродействию кусок (время в ms):

Без оптимизации, по скорости по размеру
но с /Ob1

3565 3265 3115
3755 3284 3645
3405 3535 3315
3525 3405 3265

А поскольку большая часть кода все равно не критична ко времени исполнения, мне все равно, что там компилятор нагенерит. Хотя я тоже за использование оптимизатора :)

VD>>>Значит плохо читал. А про флоат без CRT... Не просто можно но и очень даже ничего получаетя.

А>>Нормально читал :) Там, если ты помнишь, про fp всего пара абзацов, которые кратко пересказать можно так: "Если вам надо использовать fp вычисления без CRT, сами разбирайтесь, какая функция что за собой тянет, мне влом этим заниматься".

VD>Там написано, что ты лишаешся обработки ошибок типа переполнения, а в остальном достаточно определить одну глобальную переменную и все. Необходимые выкрутасы с делаются через automation API.


А>>Да и совет линковаться с LIBC.LIB вполне однозначен — это ж просто использование части CRT.


VD>Там объяснено, что многие функции CRT (а вернее ее стартап-код) не тянут и их можно смело использовать.


Я, типа, в курсе, что стартап не все тянут. Но я не считаю, что CRT == CRT startup.

VD>>>Это я тебе говорю, так как мы с БД без CRT работаем, а там флоаты частенько поадаются.

А>>И что вы с ними делаете? Юзеру показываете? А логарифм взять?

VD>Логорифм нам не нужен. Но если пондобится, то возмем фунцию и будем использовать. Мат-алгоритмы не должны цеплять стартап-код.


Так я-то говорил про CRT, а не про ейный стартап. А вообще-то, к функции log я исходников не нашел, а беглое разглядывание msvcrt.dll под микроскопом энтузиазма по поводу использования ее без стартапа не вызвало. Код там довольно обширный, и что нужно для обработки ошибок, а что собственно для вычислений я с первого взгляда не понял. И вдобавок зародилось подозрение, что при статической компоновке она все равно за собой добрый кусок CRT потянет. Вот ежели будет у кого время с ней разобраться, тогда поверю, что CRT — пережиток прошлого :-\

А>>Что такое "настройки нет"?


VD>Да это я ступил. Хотел сказать что наш код луче использует настройки ОС, т.е. региональные установки.


VD>>>Мы пишим COM-библиотеки и нужно распространять их по сети.


А>>Я не отрицаю, что есть класс задач, где CRT нафиг не нужна. Просто C++ без CRT — и не C++, и не C. И фиг его знает, что там после выхода очередного сервиспака глючить начнет.


VD>Ну, дык когда у тебя 90% времени уходит на задачи в которых CRT вредно, то привыкаешь к программированию без него. Я же не призываю всех жить без CRT, я прсто говрю, что не нужно делать заявлений, что без него С++ не С++.


Ладно, а C без printf'а — это C?


А>>А начал использовать тяжеленный wxWindows и тоже не жалею :)


VD>А это, что?


А это кроссплатформенная замена MFC. Насколько она кроссплатформенная я пока не проверял, но оно мне нравиться куда больше MFC просто для программирования под винду.

А>>Если wsprintf еще можно хоть как-то замаскировать под sprintf, то с automation API этот номер не пройдет и код (вполне безразличная к операционке его часть) станет windows-only. Да и геморроя с ним на порядок больше, чем с sprintf и иже с ними.


VD>А предствь себе какой может быть рынок сбыта для COM-объектов под Уних? :) А мы именно их делаем.


А я некоторую часть кода на чистом С++ пишу, а потом, по мере необходимости, в COM заворачиваю. Скажут через пять лет к перлу/васику/шарпу/жабе прикрутить — прикручу.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Выйти из двух циклов сразу
От: potap  
Дата: 07.06.02 07:46
Оценка:
Здравствуйте Андрей, Вы писали:

А>Здравствуйте Mishka<T>, Вы писали:


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


LG>>>я вот как раз и не хочу через исключения. И не хочу гоу-ту.

LG>>>Чего делать?

MT>>Можно так:

MT>>
MT>>while(1)
MT>>{
MT>>  for(int i = 0; i < 100; i++)
MT>>  {
MT>>    if(i == 77)
MT>>      break;
MT>>  }
MT>>  if (i < 100) break;
MT>>}
MT>>


А>Это прокатит только на VC6


Это почему же, интересно?! По-моему на любом C. Что здесь скользкого? Мне этот вариант нравится .

А>Я обычно делаю так:


А>
А>bool bContinue = true;
А>while(bContinue) {
А>  for(int i = 0; i < 100; i++) {
А>    if (i == 77) {
А>      bContinue = false;
А>      break;
А>    }
А>  }
А>}
А>


Ну а это, сэр, имхо, банально .
Re[7]: Выйти из двух циклов сразу
От: Андрей Россия  
Дата: 07.06.02 08:04
Оценка:
Здравствуйте potap, Вы писали:

skip

А>>Это прокатит только на VC6


P>Это почему же, интересно?! По-моему на любом C. Что здесь скользкого? Мне этот вариант нравится .


На C не прокатит в любом случае, там конструкции типа (for int ...) вообще запрещены, нужно писать
  int i;
  for (i...)


А насчет остального: по стандарту в конструкции типа for (int i...) переменная цикла видна только внутри блока и большинство компиялторов этому правилу следуют, поэтому вне цикла переменную i использовать не получится. А вот VC6 этому не соответствует (кстати, в VC7 это исправлено), поэтому там можно обращаться к i после цикла. И то, что такой стиль тебе нравится — может привести к тому, что тебе придется переписывать код при переходе на новую версию компилятора.


А второе твое замечание: вопрос был не про банальность или новаторское решение, а про то, кто и что использует. Я придерживаюсь такого стиля
Re[11]: Выйти из двух циклов сразу
От: Snax Россия  
Дата: 07.06.02 08:36
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>В-третьих, по поводу других предложенных методов.

AS>1. Вспомогательная функция+выход по return. Поскольку функции по правилам C могут находиться в любом месте программы (в т. ч. в другом модуле), читателю совершенно непонятно, куда приведёт return. Эту ситуацию можно немного поправить, структурируя код и добавляя комментарии, но это не меняет сути — такой подход не способствует читабельности.

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

Во-первых, я сильно сомневаюсь, что такая функция может оказаться в другом модуле.
Скорее всего, она будет или предшествовать основной, или окажется сразу после нее.
Эх, жаль что в С нельзя писать под-функции для функций (как в паскале, помните такого?)

Во-вторых, проблема с понижением читабельности не возникнет, если дать такой
функции нормальное, читабельное имя, символов на 20-40.

В-третих (тут начинается ИМХО, поэтому не буду столь категоричен), такой подход позволит
сократить основную функцию как раз на эти два вложенных цикла. На мой взгляд (подчеркиваю: мой)
программа, состоящая из 20 функций по 20 строк более читабельна, чем программа из одной
main на 400 строк.

Так что я отдаю свой голос за отдельную функцию + return.

Павел.
Re[9]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.02 15:49
Оценка:
Здравствуйте Patalog, Вы писали:

PP>Насчет вариантов —

P>По варианту, который присла ты, я тебе ответил, что считаю изменение переменной цикла внутри цикла еще большими граблями, и еще более непонятным "окружающим".

Значти за всех можешь говорить только ты?

По поводу циклав и граблей. Это применение for может вызвать грабли, как и случилось у троих человек пытавшихся переписать твой код. Многие языки высокого уровня специально не включают никаких кострукций кроме while (тот же Паскль имеет очень ограниченны по возможностям for именно по этому). И сделно это по тем же причинам, по которым не рекомендуется применять goto. В while-е вся логика идет последовательно сверху в низ и не может редставлять проблем для чтения (если конечно код не напихан).

Тебе правильно заметили, что случай твой класичкский. Повтор операции после сбоя. И решатся он именно заключеним в цикл. Ты это и сделал, но цикл организавал на goto. В товем случае это 100% не оправдано. Я понимаю что свои ошибки неприяно признавать, но попробуй взглянуть на этот код глазами человека которй его не писал...

P>И макросами здесь не поможешь.


Дык сдесь они и не нужны.

P>Ибо макросы еще большие грабли. _Имхо_.


Погляди на разные MAP-ы и на реализацию W2A в ATL.

P>На 3-й вариант (от m.a.g) я вообще еще ничего не ответил.


Это какой... Т.е. можно это понимать как согласие с ним?

P>ЗЫж А насчет "более понятные окружающим", еще раз повторюсь — отучаемся говорить за всех.


Я являюсь окружающим? Ну, тогда в чем мои слова не верны? Если не веришь давай поставим это вопрос на голосование.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.02 23:20
Оценка:
Здравствуйте Sergey, Вы писали:

S>В 10 раз? Смотря что за код, можно написать и так, что оптимизированный код в 100 раз быстрее будет. Может я пишу чего неправильно, или у меня компилятор неправильный, но вот сейчас проверил на днях написанный критичный по быстродействию кусок (время в ms):


S>Без оптимизации, по скорости по размеру

S>но с /Ob1

S>3565 3265 3115

S>3755 3284 3645
S>3405 3535 3315
S>3525 3405 3265

Значит не все включил. Я не помню, что такое /Ob1, но там и без того опций хватает.

10 мы получали на своих приложениях. Правда при этом мерился debug vs. release. Тестирование было очень простое. Мы брали наш ascBD и проганяли ряд тестов. Потом компилировали тоже самое в релиз с выкрученой по максимуму оптимизацией по скорости (с автопоинлайнингом...).

В наших приложениях энтенсивно используются шаблоны. Ну, и стараемся делать функции более короткими (декомпозицию проводим). В остольном обычный код.


Я поэксперементировал с Шустриком
Автор(ы): Владислав Чистяков
. Вот некоторые результаты:

String 3.69 47.80 12.95
pi 3.15 6.16 1.96
QuickSort 6.07 11.80 1.94
BubbleSort 4.19 9.39 2.24
StrangeAttractor 1.4 2.84 2.03

Я специально не стал брать синтетику (вызов одного метода...).

Как видишь в основном получается около 2-х раз, но один тест аж в 12!

Чем отличаются эти тесты? Во всех случаях кроме String-а это отдельные алгоритмы реализованные в одной функции. String же вызывает оператор += у класса CString. Без оптимизации вызовы делаются как полагается через стек. В оптимизированном варианте VC сделало автоподстановку чем значительно сократило накладные расходы. В остальных же случаях код довольно оптимально написан, так что оптимизатору нужно постараться.

Если твоя программа написана на goto и в стиле дремучего С, то выигрыш будет не велик, но если ты используешь шаблоны и классы-обертки, но разница может значительно превышать 10 раз.

S>А поскольку большая часть кода все равно не критична ко времени исполнения, мне все равно, что там компилятор нагенерит. Хотя я тоже за использование оптимизатора :)


Задачи разные бывают. Мы пишем компоненты которые используются в сервере приложений. Тут не бывает не критичных частей (ну, если только код инициализации и очистки глобальных объектов). К тому же если программа тормозит, то тормозит вся, вместе с теми 10% которые критичны.

VD>>Там объяснено, что многие функции CRT (а вернее ее стартап-код) не тянут и их можно смело использовать.


S>Я, типа, в курсе, что стартап не все тянут. Но я не считаю, что CRT == CRT startup.


Ты говоришь об использовании 1-2 функций из CRT. Так? Думаю, дальше ты и сам поймешь мою мысль. :)

S>Так я-то говорил про CRT, а не про ейный стартап.


А CRT сам по себе вообще никому не нужен. Нужны отдельные его функции. Сегодня мы используем из CRT 2-4 функции которые не цепляют старпап. Если будет нужна пятая, выдерем и ее.

S>Ладно, а C без printf'а — это C?


С — это язык. printf — всего лишь одна функция из его стандартной библиотеки. Зачем мешать пух с котлетами? Вот представь пишешь ты графическую программу на С... зачем тебе буден этот printf?

Хотя printf появился вместе с С и является его культурным пластом (что ли?). С++ же появился без STL. STL появилась значительно позже. Я изучал С++ без STL и использовал много библиотек которые были совершенно не похожи на STL но делали тоже самое. В конце концов не начинать же пользоваться STL только потому, что кто-то сказал что это стандартно? На сегодня у нас есть свои библиотеки которые во многом луче STL... Но опять же я не призываю ее не использовать, я просто не хочу чтобы навязывали мнение, что без нее никуда. Это ведь не правда.

VD>>А предствь себе какой может быть рынок сбыта для COM-объектов под Уних? :) А мы именно их делаем.


S>А я некоторую часть кода на чистом С++ пишу, а потом, по мере необходимости, в COM заворачиваю. Скажут через пять лет к перлу/васику/шарпу/жабе прикрутить — прикручу.


Пойми у нас с тобой разные задачи. Тебе нужна переносимость. Мне производительность, малые размеры и отсутствие зависимости. Поэтому мне CRT вредно, а для тебя без него будет ужасный геморрой. Так что давай жить как жили, только я не будет никого уговаривать, что CRT вообще никому не нужна, а ты что без нее и без STL нельзя жить, и что без них С++ не С++ и т.п. :) Договорились?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 10.06.02 04:45
Оценка:
Здравствуйте VladD2, Вы писали:

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


VD>По поводу циклав и граблей. Это применение for может вызвать грабли, как и случилось у троих человек пытавшихся переписать твой код. Многие языки высокого уровня специально не включают никаких кострукций кроме while (тот же Паскль имеет очень ограниченны по возможностям for именно по этому). И сделно это по тем же причинам, по которым не рекомендуется применять goto. В while-е вся логика идет последовательно сверху в низ и не может редставлять проблем для чтения (если конечно код не напихан).


Имхо, эти грабли которые ты упоминаешь, вызваны протой невнимательностью. _Всю_ логику в "последовательно сверху в низ" не впихнешь.

VD>Тебе правильно заметили, что случай твой класичкский. Повтор операции после сбоя. И решатся он именно заключеним в цикл. Ты это и сделал, но цикл организавал на goto. В товем случае это 100% не оправдано. Я понимаю что свои ошибки неприяно признавать, но попробуй взглянуть на этот код глазами человека которй его не писал...


Vlad, в чем ошибка то, ты объясни наконец. Код верный, работает прекрасно. Кто скажет, что его невозможено модифицировать, пусть первый кинет в меня камень.(c) В чем неоправданность такого решения? То что читать труднее? Спорно. И об этом говорил не только я, но и пресловутые "окружабющие".

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

P>>И макросами здесь не поможешь.


VD>Дык сдесь они и не нужны.


Дык вроде это ты говорил что что-то там можно завернуть в макросы и т.д.

P>>Ибо макросы еще большие грабли. _Имхо_.


VD>Погляди на разные MAP-ы и на реализацию W2A в ATL.


Ну и? Корректно, как и некорректно можно написать что угодно. Тебе привести примеры, когда макрос будет потенциальной граблей? Или может ты уже сам наступал?

P>>На 3-й вариант (от m.a.g) я вообще еще ничего не ответил.


VD>Это какой... Т.е. можно это понимать как согласие с ним?


Сильно понравился своей оригинальностью.

P>>ЗЫж А насчет "более понятные окружающим", еще раз повторюсь — отучаемся говорить за всех.


VD>Я являюсь окружающим? Ну, тогда в чем мои слова не верны? Если не веришь давай поставим это вопрос на голосование.


Являешься. Но ты говорил о 80%. Или ты и есть все 80?
Поставь. Правда, там уже и так куча гололсований навеянных этим тредом. Может он войдет в историю...

ЗЫж Кстати, идея, может сделать что-то типа книги рекордов RSDN?
Почетный кавалер ордена Совка.
Re[21]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 10.06.02 06:04
Оценка:
Здравствуйте VladD2, Вы писали:

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


S>>В 10 раз? Смотря что за код, можно написать и так, что оптимизированный код в 100 раз быстрее будет. Может я пишу чего неправильно, или у меня компилятор неправильный, но вот сейчас проверил на днях написанный критичный по быстродействию кусок (время в ms):


S>>Без оптимизации, по скорости по размеру

S>>но с /Ob1

S>>3565 3265 3115

S>>3755 3284 3645
S>>3405 3535 3315
S>>3525 3405 3265

VD>Значит не все включил. Я не помню, что такое /Ob1, но там и без того опций хватает.


Ладно, а что надо было включать? Я включал просто "оптимизацию по размеру" и "оптимизацию по скорости". А /Ob1 — разрешить инлайновость.

VD>10 мы получали на своих приложениях. Правда при этом мерился debug vs. release. Тестирование было очень простое. Мы брали наш ascBD и проганяли ряд тестов. Потом компилировали тоже самое в релиз с выкрученой по максимуму оптимизацией по скорости (с автопоинлайнингом...).


Во-первых, debug vs. release сами по себе в среднем (на достаточно большом куске кода) отличаются по производительности в 2-3 раза.

VD>В наших приложениях энтенсивно используются шаблоны. Ну, и стараемся делать функции более короткими (декомпозицию проводим). В остольном обычный код.



VD>Я поэксперементировал с Шустриком
Автор(ы): Владислав Чистяков
. Вот некоторые результаты:


VD>String 3.69 47.80 12.95

VD>pi 3.15 6.16 1.96
VD>QuickSort 6.07 11.80 1.94
VD>BubbleSort 4.19 9.39 2.24
VD>StrangeAttractor 1.4 2.84 2.03

VD>Я специально не стал брать синтетику (вызов одного метода...).


Хм, надо будет QuickSort проверить. Чего то слишком большие отличия.

VD>Как видишь в основном получается около 2-х раз, но один тест аж в 12!


VD>Чем отличаются эти тесты? Во всех случаях кроме String-а это отдельные алгоритмы реализованные в одной функции. String же вызывает оператор += у класса CString. Без оптимизации вызовы делаются как полагается через стек. В оптимизированном варианте VC сделало автоподстановку чем значительно сократило накладные расходы. В остальных же случаях код довольно оптимально написан, так что оптимизатору нужно постараться.


Я ж сказал — я инлайновость тоже включаю. Без нее и вправду плохо бывает. А вот остальные опции выигрыш дают достаточно маленький.

VD>Если твоя программа написана на goto и в стиле дремучего С, то выигрыш будет не велик, но если ты используешь шаблоны и классы-обертки, но разница может значительно превышать 10 раз.


В вычислениях особо не позаворачиваешь :) А вообще, выполнение некоторых достаточно простых правил, например вынесение многоэтажного разыменования из цикла, приводит к тому, что оптимизатору негде разгуляться.

S>>А поскольку большая часть кода все равно не критична ко времени исполнения, мне все равно, что там компилятор нагенерит. Хотя я тоже за использование оптимизатора :)


VD>Задачи разные бывают. Мы пишем компоненты которые используются в сервере приложений. Тут не бывает не критичных частей (ну, если только код инициализации и очистки глобальных объектов). К тому же если программа тормозит, то тормозит вся, вместе с теми 10% которые критичны.


У нас — нет :) Если тормозит вычислительная часть, на юзер интерфейсе это никак не сказывается. Просто будет считать в 10 раз дольше :)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[15]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 10.06.02 06:38
Оценка:
Здравствуйте m.a.g., Вы писали:

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


S>>А, таки кто-то вспомнил о мамонте, ради поражения которого и придумывался кремневый наконечник для копья, более известный как goto. Ну так такие задачи, если они большие, уж много лет принято естественным или не очень образом раскладывать на более мелкие, и с данными работать локально.


...>Да, но если вдруг внутри крупной проблемы возникает мелкая задачка, которая естественным образом раскладывается в глобальные операции над глобальными данными (fe какая-нибудь задача трансформации строки, управляемая правилами), то лучше этот маленький кусочек написать в стиле схем Янова и не мучать себя структурностью.


Это все от лени. Получишь (скорее всего, небольшой) выигрыш сейчас и проигрыш (а вот проигрыш обычно поболее) потом, в процессе поддержки программы.

...>Вообще, написание действительно большого проекта в одном стиле свидетельствует либо о недостаточной квалификации разработчиков, либо о дефекте проектирования. Всегда возникают локальные подзадачи, лучше выражаемые на стиле, отличном от основного. Если при этом язык позволяет поддержать все используемые стили, то это вообще шикарно. Не буду голословным:


...>- кто сейчас пишет парсеры вручную? есть же lex/yacc/bison/antlr etc Ведь парсеры — обработка, основанная на

...> правилах, структурно писать их не слишком удобно

...>- 'AI' в игрушках, что бы не говорили, писать на Prolog/Refal удобнее, чем на C/C++


...>- конечные автоматы тоже не слишком удобно реализуются на C/C++. Гораздо удобнее моделировать их на UML и

...> создавать код автоматически (кстати, проект Zebra, в котором я работаю, этим и занимается)

...>- Событийная модель. В ООП ложится, но вот в структурность — никак.


...>- Математика. Ну как ее в ООП засунуть? Самая мощная модель, которая помогает работать с математикой -

...> объектная, благо отношения наследования в ООП в математике никак не помогают (заинтересовавшихся отсылаю
...> к книге Элджера "C++ for real programmers" или в любую книгу по теории моделей). Так что писать ООП
...> программы для работы с математическими выражениями не слишком удобно, тут нужно либо обобщенное, либо
...> структурное программирование, непосредственно выражающие алгоритмику.

...>- [место для вашей рекламы] :)


...>Таким образом, каждую часть кода нужно писать в том стиле, который наиболее естественен для решаемой подзадачи (вот меня недавно хотели усадить трансформировать UML диаграмму -> HTML с помощью Java. Не дался, на XSLT все сделал), а вот для каждого конкретного стиля можно решать, нужен там goto или его туда вообще вставлять нельзя.


Ну-ну. Попробуй тогда для программирования на С++ придумать задачу, где массирование применение goto было бы оправданным. И, кстати, лично я считаю, что обобщенное программирование от ООП отличается только "технологически" — производительностью, способом реализации, но не концептуально. Все, что можно сделать с помощью обобщенного программирования, можно сделать с помощью ООП, но (в рамках существующих языков и компиляторов) с большими издержками и, возможно, менее изящно (хотя на вкус и на цвет...).

S>>>>А вообще, у оператора goto есть одна неприятная особенность — он потенциально может передать управление куда угодно, "вверх" или "вниз", в отличие от return или break. Струкутурно программа написана или как-то иначе, роли не играет — тупо увеличивается время на поиск метки. Чеолвек мыслит в основном идиомами, а неоправданное применение goto эти идиомы разбивает (оправданным я считаю, например, применение goto для очистки ресурсов в C++, совершенно идеоматическое, кстати, особенно если метку называть как-нибудь вроде cleanup).


...>Поправка. Обыкновенная зашоренность сознания. Идиомы, говорящие, что не будет неожиданного перехода — структурные идиомы.


Зашоренность это или нет, но, поскольку возможности мозга не безграничны, речь идет о банальном перераспределении ресурсов — если программисту придется удерживать в голове взаимосвязи между десятком-другим меток и операторов goto, он просто не сможет сконцентрировать внимание ни на чем другом, в том числе на решаемой задаче.

...>Человеку, привыкшему писать в структурном стиле, сложно понять реализацию схем Янова, очевидно. Человеку, привыкшему реализовывать схемы Янова, трудно понять структурные программы. Бывалому ассемблерщику метку найти очень просто ;), но он будет долго разбираться со специализацией шаблонов etc


Ну, сравни производительность труда "бывалого ассемблерщика" и среднего "программиста на С++" при программировании на С++. То, к каким идиомам человек привык, конечно, играет роль, но не ключевую — увидит более удобную, привыкнет и к ней. Это как с аппликатурой при игре на гитаре — если сразу научили правильно ставить пальцы, играть тебе будет проще. Если же нет, возможно, разовьешь большую гибкость пальцев, но играть все равно будешь хуже, если ты, конечно, не гений. Идиомы не на пустом месте возникли, они отражают возможности "среднего" человека, хорошо это или плохо.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[16]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 10.06.02 08:54
Оценка:
Здравствуйте Sergey, Вы писали:


S>Ну, сравни производительность труда "бывалого ассемблерщика" и среднего "программиста на С++" при программировании на С++. То, к каким идиомам человек привык, конечно, играет роль, но не ключевую — увидит более удобную, привыкнет и к ней. Это как с аппликатурой при игре на гитаре — если сразу научили правильно ставить пальцы, играть тебе будет проще. Если же нет, возможно, разовьешь большую гибкость пальцев, но играть все равно будешь хуже, если ты, конечно, не гений. Идиомы не на пустом месте возникли, они отражают возможности "среднего" человека, хорошо это или плохо.


Если уж продолжать метафоры, то C++ — это не гитара, а некий инструмент, превращаемый хоть в баян, хоть в балалайку, хоть в саксофон. И иметь возможность воспользоваться всей силой C++ — это уметь играть на всех этих инструментах. Тогда твои слова звучат так: "поскольку большинство людей пользуется C++ как губной гармошкой, то нужно при работе с C++ в качестве рояля держать рояль двумя руками, прикладывать ко рту и дуть в него".
Re[16]: Выйти из двух циклов сразу
От: m.a.g. Мальта http://dottedmag.net/
Дата: 10.06.02 08:55
Оценка:
Здравствуйте Sergey, Вы писали:


S>Ну, сравни производительность труда "бывалого ассемблерщика" и среднего "программиста на С++" при программировании на С++. То, к каким идиомам человек привык, конечно, играет роль, но не ключевую — увидит более удобную, привыкнет и к ней. Это как с аппликатурой при игре на гитаре — если сразу научили правильно ставить пальцы, играть тебе будет проще. Если же нет, возможно, разовьешь большую гибкость пальцев, но играть все равно будешь хуже, если ты, конечно, не гений. Идиомы не на пустом месте возникли, они отражают возможности "среднего" человека, хорошо это или плохо.


Если уж продолжать метафоры, то C++ — это не гитара, а некий инструмент, превращаемый хоть в баян, хоть в балалайку, хоть в саксофон. И иметь возможность воспользоваться всей силой C++ — это уметь играть на всех этих инструментах. Тогда твои слова звучат так "поскольку большинство людей пользуется C++ как губной гармошкой, то нужно при работе с C++ в качестве рояля держать рояль двумя руками, прикладывать ко рту и дуть в него".
Re[11]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.02 18:04
Оценка:
Здравствуйте Patalog, Вы писали:

P>Имхо, эти грабли которые ты упоминаешь, вызваны протой невнимательностью.


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

P>_Всю_ логику в "последовательно сверху в низ" не впихнешь.


Естественно, для повторного вызова кода существуют циклы и функции.

P>Vlad, в чем ошибка то, ты объясни наконец.


Ты вместо оператора цикла или перекомпановки кода организовал циклв на goto при этом твой код стал не структурированным и сложным для восприятия.

P>Код верный, работает прекрасно.


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

P> Кто скажет, что его невозможено модифицировать, пусть первый кинет в меня камень.(c) В чем неоправданность такого решения? То что читать труднее? Спорно. И об этом говорил не только я, но и пресловутые "окружабющие".


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

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


Это к вкусом никакого отношения не имеют. Как грязь и разгильдяйство не могут быть составляющими культуры, так применение конструкций делающих код неструктурированным не имеет отношения к вкусом.

Заметь большинство защитников goto оппелировали к тому, что goto можно использовать не нарушая струкурированнсоти прогаммы. Той же случай таковым не является.

P>>>И макросами здесь не поможешь.

VD>>Дык сдесь они и не нужны.
P>Дык вроде это ты говорил что что-то там можно завернуть в макросы и т.д.

Это говорил IT и еще ктото. Я сними согласен, но они говорили о другом случае. Там разбирались случаи выхода из вложенного цикла и обработка ошибок с помощью goto. Ты же с помощью этого оператора организуешь дополнительный цикл.

P>>>Ибо макросы еще большие грабли. _Имхо_.


VD>>Погляди на разные MAP-ы и на реализацию W2A в ATL.


P>Ну и? Корректно, как и некорректно можно написать что угодно. Тебе привести примеры, когда макрос будет потенциальной граблей? Или может ты уже сам наступал?


Макросы это механизм позволяющий обойти недостаки языка и реализовать абстракции которых этот язык не поддерживает. Если человек полностью осознает что он делает, то макросы можно использовать для благих целей. Хотя в немумелых руках макросы могут породить очень трудно обнаруживаемые грабли.

P>>>На 3-й вариант (от m.a.g) я вообще еще ничего не ответил.

VD>>Это какой... Т.е. можно это понимать как согласие с ним?

P>Сильно понравился своей оригинальностью.


Да, который? И, что же в нем такого оригинального?

P>Являешься. Но ты говорил о 80%. Или ты и есть все 80?


Я делаю предположиния. На сегодня я могу сказать тебе более точную цифру:
Можно ли использовать goto?
Обязательно!            0.86%
Можно.                   14.66%
Итого:                   15.52%

Нежелательно, 
но иногда приходится.  31.90%
Крайне нежелательно.   40.52%
Гнать в шею             6.03%
Можно, но я так 
делать не буду. ;^)     6.03%
Итого:                 84.48%


Врят ли ты будешь спорить, что в твоем случае представители второй группы согласились бы, что применение в твоем случае goto является необъодимым, а сталобыть и оправданным. Так что я ошибся не сильно... на 4%.

P>Поставь. Правда, там уже и так куча гололсований навеянных этим тредом. Может он войдет в историю...


Он вошел в историю еще 30 лет назад. А ставить должен ты. Мне и так все ясно.

P>ЗЫж Кстати, идея, может сделать что-то типа книги рекордов RSDN?


Боюсь я тебя расстрою... Такая крига уже есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.02 19:19
Оценка:
Здравствуйте Sergey, Вы писали:

S>Ладно, а что надо было включать?


Проекты Шустрика доступны на этом сайте. Скачай погляди. Если коротко, то все. У VC7 есть еще одна крутая опция оптимизации (/GL для компилятора и /LTCG для линкера). Называется "Whole program optimithation". Общий смысл таков она помещает в obj-и не машинный код, а нечто на подобии MSIL (промежуточный байт-код) и ликер сам генерирует код. При этом инлайнится могут любые функции, даже если они помещены в отдельных cpp-файлах и доступны через axtern (кроме библиотечных). С этой опцией к сожалению не совместмы прекомпелируемые заголовочные файлы.

S>Я включал просто "оптимизацию по размеру" и "оптимизацию по скорости". А /Ob1 — разрешить инлайновость.


Там еще куча оций. Скачай проект посмотри.
И лучше не /Ob1, а /Ob2, ну, и /GL c /LTCG.

Кстати, инлайн подстановка это очень важная часть оптимизации. Так что говорить, что ты измерял скорость не оптимизированной версии нельзя. Дюди принимающие решение отказаться от оптимизатора считают, что он глючит (хотя в 99% гличит именно их код). По этому они не только не включают какой-нибудь оптимизации, но и оставлюяют все настройки как дебаге. Это позволяет им не вылавливать ошибки в релизе (ошибки попросту замазываются дебаг-инициализацией и т.п.).

S>Во-первых, debug vs. release сами по себе в среднем (на достаточно большом куске кода) отличаются по производительности в 2-3 раза.


Дык все отличия и заключаются в отключенной оптимизации и дебажных библиотеках. В Шустрике библиотекчных функций не использовалось (только класс строк). Но как я уже говорил раньше те кто борятся с оптимизацией борятся и с рантайм-библиотеками.

S>Хм, надо будет QuickSort проверить. Чего то слишком большие отличия.


Я наверно забыл описать колонки.

Так что еще раз:
Тестт            С оптимизацией Без оптимизации Разница в %
String           3.69             47.80         12.95
pi               3.15              6.16          1.96
QuickSort        6.07             11.80          1.94
BubbleSort       4.19              9.39          2.24
StrangeAttractor 1.4               2.84          2.03


S>Я ж сказал — я инлайновость тоже включаю. Без нее и вправду плохо бывает. А вот остальные опции выигрыш дают достаточно маленький.


Ну, ты еще /Ox добавь и говори, что без оптимизации.

S>В вычислениях особо не позаворачиваешь А вообще, выполнение некоторых достаточно простых правил, например вынесение многоэтажного разыменования из цикла, приводит к тому, что оптимизатору негде разгуляться.


Этих правил штук двадцать (если не больше), и их выполнение зачастую делает код менее читабельным (хотя иногда и наоборот). Так что лучше заботится о читаемости кода, а пробемы с местной оптимизацие возложить на компилятор.

VD>>Задачи разные бывают. Мы пишем компоненты которые используются в сервере приложений. Тут не бывает не критичных частей (ну, если только код инициализации и очистки глобальных объектов). К тому же если программа тормозит, то тормозит вся, вместе с теми 10% которые критичны.


S>У нас — нет Если тормозит вычислительная часть, на юзер интерфейсе это никак не сказывается. Просто будет считать в 10 раз дольше


Мне вот интересна мотивация тех кто выключает оптимизацию. Я видил много "ошибок релиз-версии", 99% из них не были связаны с оптимизатором.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 11.06.02 07:07
Оценка:
Здравствуйте VladD2, Вы писали:

S>>Ладно, а что надо было включать?


VD>Проекты Шустрика доступны на этом сайте. Скачай погляди. Если коротко, то все. У VC7 есть еще одна крутая опция оптимизации (/GL для компилятора и /LTCG для линкера). Называется "Whole program optimithation". Общий смысл таков она помещает в obj-и не машинный код, а нечто на подобии MSIL (промежуточный байт-код) и ликер сам генерирует код. При этом инлайнится могут любые функции, даже если они помещены в отдельных cpp-файлах и доступны через axtern (кроме библиотечных). С этой опцией к сожалению не совместмы прекомпелируемые заголовочные файлы.


А прекомпилируемые заголовочные файлы тоже неслабо глючат. Сколько раз из-за них pure virtual function call получал, и не сосчитать.

S>>Я включал просто "оптимизацию по размеру" и "оптимизацию по скорости". А /Ob1 — разрешить инлайновость.


VD>Там еще куча оций. Скачай проект посмотри.


Ну, скачал (первого, для третьего ссылка битая), почти те же опции, что и я использовал для второй колонки. Не считая того, что вы зачем-то включили /Op, и ваша программа "may be slower and larger than one compiled without /Op". И включили две неизвестные моему компилятору опции /O3 и /QaxM :)

VD>И лучше не /Ob1, а /Ob2, ну, и /GL c /LTCG.


С выключенной оптимизацией (/Od) на моем коде я отличий /Ob1 от /Ob2 не заметил — в бинарнике размером 884736 bytes отличаются всего 2726 байт, размер бинарников совпадает.

VD>Кстати, инлайн подстановка это очень важная часть оптимизации. Так что говорить, что ты измерял скорость не оптимизированной версии нельзя. Дюди принимающие решение отказаться от оптимизатора считают, что он глючит (хотя в 99% гличит именно их код). По этому они не только не включают какой-нибудь оптимизации, но и оставлюяют все настройки как дебаге. Это позволяет им не вылавливать ошибки в релизе (ошибки попросту замазываются дебаг-инициализацией и т.п.).


Не надо обобщений :) Во-первых, оптимизатор и вправду глючит — я видел как минимум два случая собственными глазами. Другое дело, что даже для debug я натыкался как минимум на одну ошибку кодогенерации — компилятор построил для одной функции exception frame там, где его быть не должно, а дальше нагенерил код как будто этого фрейма и не было. Естественно, программа падала при обращении к первой же переменной в этой функции. И не надо мне говорить, что это мне померещилось — я часа три потратил, чтобы разобраться что к чему :) Насчет настроек в release как в дебаге — этим не занимаюсь :)) Простое включение опции /Od не приводит к debug инициализации переменных.

S>>Во-первых, debug vs. release сами по себе в среднем (на достаточно большом куске кода) отличаются по производительности в 2-3 раза.


VD>Дык все отличия и заключаются в отключенной оптимизации и дебажных библиотеках. В Шустрике библиотекчных функций не использовалось (только класс строк).


В два-три раза по быстродействию код отличается и из-за разных библиотек, и из-за debug инициализации, я ж release с выключенной оптимизацией c дебагом сравнивал. А может, и еще из-за чего, о чем я и не подозреваю :)

А для CString сравнивать debug с release и говорить, что сравнивали код с оптимизацией и код без оптимизации вообще нельзя. Потому что сравнивали по быстродействию вы совершенно разный код. Загляни в имплементацию MFC'шного CString и убедись.

VD>Но как я уже говорил раньше те кто борятся с оптимизацией борятся и с рантайм-библиотеками.


S>>Хм, надо будет QuickSort проверить. Чего то слишком большие отличия.


VD>Я наверно забыл описать колонки. :shuffle:


VD>Так что еще раз:

VD>
VD>Тестт            С оптимизацией Без оптимизации Разница в %
VD>String           3.69             47.80         12.95
VD>pi               3.15              6.16          1.96
VD>QuickSort        6.07             11.80          1.94
VD>BubbleSort       4.19              9.39          2.24
VD>StrangeAttractor 1.4               2.84          2.03
VD>


Ну, в отличия по производительности до 2 раз я вполне верю. Я было подумал, третья колонка — какая-нибудь особо извращенная оптимизация :)

S>>Я ж сказал — я инлайновость тоже включаю. Без нее и вправду плохо бывает. А вот остальные опции выигрыш дают достаточно маленький.


VD>Ну, ты еще /Ox добавь и говори, что без оптимизации. ;)


Э, нее... Мы про оптимизацию заговорили, когда кто-то утверждал, что оптимизатор от кода в каком-то конкретном примере камня на камне не оставит, а я сказал что оптимизацию не использую. Вот в том контексте разрешение инлайновости — не оптимизация. А вообще на тему, считать ли инлайновость оптимизацией можно долго и бесплодно флеймить :). Лично я /Ob, /Oy (Frame-Pointer Omission) и /Oi (Generate Intrinsic Functions) за оптимизацию не считаю — их принадлежность к опциям оптимизации скорее маркетинговый ход. Скорее уж /Od следовало бы называть не disable optimization, а generate dumb code :)
Хотя /Oy я тоже не использую — с ней стек не раскрутишь, если программа упадет.

S>>В вычислениях особо не позаворачиваешь :) А вообще, выполнение некоторых достаточно простых правил, например вынесение многоэтажного разыменования из цикла, приводит к тому, что оптимизатору негде разгуляться.


VD>Этих правил штук двадцать (если не больше), и их выполнение зачастую делает код менее читабельным (хотя иногда и наоборот). Так что лучше заботится о читаемости кода, а пробемы с местной оптимизацие возложить на компилятор.


В моем случае проблемы с местной оптимизацией не обсуждаются :) Партия сказала "надо". А насчет двадцати штук правил ты, IMHO, переборщил. А вообще, все эти правила еще со времен царя гороха сидят в башке и под руку толкают, так что их применение почти бесплатно.

VD>Мне вот интересна мотивация тех кто выключает оптимизацию. Я видил много "ошибок релиз-версии", 99% из них не были связаны с оптимизатором.


Да простая мотивация — оптимизатор таки (изредка) поглюкивает, и у нас считают, что выигрыш от его использования не окупает необходимости борьбы с этими глюками. Что касается "ошибок релиз-версии", то вот они мне что-то редко встречаются (как бы не сглазить...)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[24]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.06.02 14:52
Оценка:
Здравствуйте Sergey, Вы писали:

S>А прекомпилируемые заголовочные файлы тоже неслабо глючат. Сколько раз из-за них pure virtual function call получал, и не сосчитать.


Не замечал. Мы в дебаге всегда их используем. Даже с ними компилиция проекта (полная) занимает по 20 минут. Так что без них нугуда. :(

S>>>Я включал просто "оптимизацию по размеру" и "оптимизацию по скорости". А /Ob1 — разрешить инлайновость.


VD>>Там еще куча оций. Скачай проект посмотри.


S>Ну, скачал (первого, для третьего ссылка битая)


Тогда попробуй вот отсюда:
http://www.optim.ru/cs/2002/1/shustric3/shustrik3.asp

S>, почти те же опции, что и я использовал для второй колонки. Не считая того, что вы зачем-то включили /Op, и ваша программа "may be slower and larger than one compiled without /Op".


Ты по-моему говорил, что компилировался с одной /Ob1.

S>И включили две неизвестные моему компилятору опции /O3 и /QaxM :)


Это для Intel C++.

VD>>И лучше не /Ob1, а /Ob2, ну, и /GL c /LTCG.


S>С выключенной оптимизацией (/Od) на моем коде я отличий /Ob1 от /Ob2 не заметил — в бинарнике размером 884736 bytes отличаются всего 2726 байт, размер бинарников совпадает.


Компилируя большой проект (ascDB) мы получали примерно 10-20 процентов выигрыша с /Ob2. Что дают /GL c /LTCG пока не пробывали, так как они появились только в VC7. Но судя по иписанию они должны давать хорошую скорость даже с выключенной /Ob

S>Не надо обобщений :) Во-первых, оптимизатор и вправду глючит


Все на свете глючит. Но все же ошибки оптимизатора встречаются на порядки реже чем ляпы программистов которые своливаются на оптимизатор.

VD>>Дык все отличия и заключаются в отключенной оптимизации и дебажных библиотеках. В Шустрике библиотекчных функций не использовалось (только класс строк).


S>В два-три раза по быстродействию код отличается и из-за разных библиотек,


В Шустрике небыло разных быиблиотек. Там вообще не вызывались библиотечные функции.

S>А для CString сравнивать debug с release и говорить, что сравнивали код с оптимизацией и код без оптимизации вообще нельзя. Потому что сравнивали по быстродействию вы совершенно разный код. Загляни в имплементацию MFC'шного CString и убедись.


Все равно оптимизированюй код в этом случае будет значительно быстрее.

VD>>Так что еще раз:

VD>>
VD>>Тестт            С оптимизацией Без оптимизации Разница в %
VD>>String           3.69             47.80         12.95
VD>>pi               3.15              6.16          1.96
VD>>QuickSort        6.07             11.80          1.94
VD>>BubbleSort       4.19              9.39          2.24
VD>>StrangeAttractor 1.4               2.84          2.03
VD>>


S>Ну, в отличия по производительности до 2 раз я вполне верю. Я было подумал, третья колонка — какая-нибудь особо извращенная оптимизация :)


Учти, что это на чистых алгоритмах. В них и оптимизировать то нечего. А на больших приложениях... К тому же люди отказывающиеся от оптимизации обычно попросту используют дебаг-версии.

VD>>Ну, ты еще /Ox добавь и говори, что без оптимизации. ;)


S>Э, нее... Мы про оптимизацию заговорили, когда кто-то утверждал, что оптимизатор от кода в каком-то конкретном примере камня на камне не оставит, а я сказал что оптимизацию не использую. Вот в том контексте разрешение инлайновости — не оптимизация.


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

S> А вообще на тему, считать ли инлайновость оптимизацией можно долго и бесплодно флеймить :). Лично я /Ob, /Oy (Frame-Pointer Omission) и /Oi (Generate Intrinsic Functions) за оптимизацию не считаю — их принадлежность к опциям оптимизации скорее маркетинговый ход.


Они сильно изменяют код (выбрасывая здоровые куски, с чем и пытаются бороться отказывающиеся от оптимизации) и приводят к существенному увеличению производительности.

Неужели у вас в конторе запрещают оптимизатор но разрешают инлайнинг?

S>Да простая мотивация — оптимизатор таки (изредка) поглюкивает, и у нас считают, что выигрыш от его использования не окупает необходимости борьбы с этими глюками. Что касается "ошибок релиз-версии", то вот они мне что-то редко встречаются (как бы не сглазить...)


:))
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Выйти из двух циклов сразу
От: Sergey Россия  
Дата: 13.06.02 06:59
Оценка:
Здравствуйте VladD2, Вы писали:

S>>А прекомпилируемые заголовочные файлы тоже неслабо глючат. Сколько раз из-за них pure virtual function call получал, и не сосчитать.


VD>Не замечал. Мы в дебаге всегда их используем. Даже с ними компилиция проекта (полная) занимает по 20 минут. Так что без них нугуда. :(


Я новую ветку начал — тема слишком далеко ушла от goto и циклов :)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[13]: Выйти из двух циклов сразу
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.06.02 02:09
Оценка:
Здравствуйте Patalog, Вы писали:

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


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


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


P>Мсье был в городе Мухосранске? А ежели стоимость доставки дискетки сравнима по стоимости с железкой?

Это где такое??? Я имею в виду программируемые железки дешевле 24уе? См. тарифы на курьерскую доставку в Мухосранск.
P>>>Ежели в моем "замечательном монолите" будет критическая ошибка меня и так уволят ;)

VD>>А толку, то? Исправить то твой монлит уже никто не сможет.


P>Ты пробовал, ты знаешь. Все прекрасно правится. Может и не так быстро но правиться. А в данной ситуации (я повторюсь я возвел ее в ранг гиперболы, так же как и вы пресловутый "монолит") закладываться на возможные ошибки просто нерентабельно.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Выйти из двух циклов сразу
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.06.02 02:26
Оценка:
W>Итак я придумал хороший вопрос, если он понравится можно открать тему.
W>Мне приходится пользоваться MSN (аська у нас отключена).
W>Но внем несохраняется история разговора в окне(если его закрыть).
W>Вопрос как это зделать (можно перейти на совмесное решение проблемы).
W>Я посмотрел библиотека типов там есть. Но описания интерфейсов я пока
W>ненашел.А тема будет звучать так доработаем MSN если Билл этого делать
W>нехочет.
Поставь Trillian
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 14.06.02 07:03
Оценка:
Здравствуйте Sinclair, Вы писали:


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


P>>Мсье был в городе Мухосранске? А ежели стоимость доставки дискетки сравнима по стоимости с железкой?

S>Это где такое??? Я имею в виду программируемые железки дешевле 24уе? См. тарифы на курьерскую доставку в Мухосранск.

А это легенда. Почитай тред сначала и не обостряйся, тема давно закрыта.
Почетный кавалер ордена Совка.
Re[7]: Выйти из двух циклов сразу
От: Аноним  
Дата: 18.06.02 20:52
Оценка:
MT>>>Можно так:
MT>>>
MT>>>while(1)
MT>>>{
MT>>>  for(int i = 0; i < 100; i++)
MT>>>  {
MT>>>    if(i == 77)
MT>>>      break;
MT>>>  }
MT>>>  if (i < 100) break;
MT>>>}
MT>>>


А>>Это прокатит только на VC6 ;)


P>Это почему же, интересно?! По-моему на любом C. Что здесь скользкого? Мне этот вариант нравится :up: .

Нравится? Ну и зря. Если параметр цикла (100) поменяется, вы должны будете поменять его в двух местах. Во втором месте вы поменать забудете — вот вам и новый баг. Зачем же их плодить?


А>>Я обычно делаю так:


А>>
А>>bool bContinue = true;
А>>while(bContinue) {
А>>  for(int i = 0; i < 100; i++) {
А>>    if (i == 77) {
А>>      bContinue = false;
А>>      break;
А>>    }
А>>  }
А>>}
А>>


P>Ну а это, сэр, имхо, банально :down: .

'Банально' в ваших устах звучит как ругательство?
Этот вариант лучше, ибо будет работать даже под водой.
Re[3]: Выйти из двух циклов сразу
От: Аноним  
Дата: 18.06.02 20:55
Оценка:
P>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...

P>ЗЫж Не флейма окаянного ради, может я и правда чего не знаю/понимаю?

Книжек почитайте, там все написано. Или в Минском БГУИР поучитесь, там объяснят
Re[4]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 19.06.02 06:21
Оценка:
Здравствуйте Аноним, Вы писали:

P>>Никак не могу понять почему народ так боится goto? Для этого есть какие-то причины помимо эстетических? Ежели есть просветите плиз. А то я иногда пользуюсь, особенно в подобных случаях, и мне кажется это более красиво, чем с переменной...


P>>ЗЫж Не флейма окаянного ради, может я и правда чего не знаю/понимаю?

А>Книжек почитайте, там все написано. Или в Минском БГУИР поучитесь, там объяснят

ПациЭнт, не обостряйтесь, весна уже давно кончилась.
Лучше объясните популярно чему это вас научили в славном "Минском БГУИР". Али книжки процитируйте...
Почетный кавалер ордена Совка.
Re[12]: Выйти из двух циклов сразу
От: Whirlwind Россия http://whirlwind.ru
Дата: 12.08.02 10:38
Оценка:
Здравствуйте Sergey, Вы писали:

S>И правильно сделали. А комитет по стандартизации C++ правильно делает, что goto не убирает. Хотя break усовершенствовать не помешало бы — глядишь, goto только в legacy коде и остался бы.


AS>>Проблема в том, чтоь вложенные циклы со сложной логикой выхода — конструкция сама по себе не очень очевидная. Я согласен, что если программу можно перепроектировать и избавиться от них, то это нужно сделать. Но это возможно не всегда.


ИМХО, Sergey предлагает усовершенствовать break для того, что бы добиться неявности, описанной в следующем абзаце. Может быть и return таким образом... Нет, лучше заменить все это одним оператором...

ЗЫ; Неужели я дочитал до этого места.
Re: Выйти из двух циклов сразу
От: Poudy Россия  
Дата: 16.08.02 22:22
Оценка:
Простите-извините, чисто из любопытства, а как бы вы отнеслись к такому вот:

while(1): needBreak;
{
  for(int i = 0; i < 100; i++)
  {
   if(i == 77) break needBreak;
  }
}


Это, конечно, не С++, но break 2 — порождает ошибки при появлении новых {}, а это, вроде, выглядит прилично. ?
Re: Выйти из двух циклов сразу
От: Pushkin Россия www.linkbit.com
Дата: 16.10.02 06:39
Оценка:
Безумно высокое количество откликов на этот в общем-то невинный вопрос говорит о том,
что он попал в больное место — НУ НЕТ здесь нормального способа выйти.
Почему бы нам всем не признать, что разработчики языка лоханулись, и просто ЗАБЫЛИ
дать нам эту возможность.
Ведь это было так просто — какое-нибудь ключевое слово типа breakbreak или break2.
Предлагаю написать возмущённое письмо

ЗЫ: Меня давно мучит вопрос, а нельзя ли это как-то своими силами сделать —
задефайнить как-нибудь, пусть даже и монстра какого-нибудь ассемблерного,
но чтоб потом одно слово BREAKBREAK писать
Re[3]: Выйти из двух циклов сразу
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 16.10.02 08:24
Оценка:
Здравствуйте neutrino, Вы писали:

N>это крайне неэффективно, на обработку исключения тратится очень много ресурсов (порядка в 1000 раз медленнее), его нужно выбрасывать только в крайних случаях.

N>наверняка такой цикл выполняется много раз.

Ну на счет тысячи положим ты загнул, на самом деле где то 10.
Но выбрасывать исключение для такого это архитектурно не правильно,
помоему об этом даже Страуструп писал.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[2]: Выйти из двух циклов сразу
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 16.10.02 08:26
Оценка:
Здравствуйте Pushkin, Вы писали:


P>Безумно высокое количество откликов на этот в общем-то невинный вопрос говорит о том,

P>что он попал в больное место — НУ НЕТ здесь нормального способа выйти.
P>Почему бы нам всем не признать, что разработчики языка лоханулись, и просто ЗАБЫЛИ
P>дать нам эту возможность.
P>Ведь это было так просто — какое-нибудь ключевое слово типа breakbreak или break2.
P>Предлагаю написать возмущённое письмо

P>ЗЫ: Меня давно мучит вопрос, а нельзя ли это как-то своими силами сделать —

P>задефайнить как-нибудь, пусть даже и монстра какого-нибудь ассемблерного,
P>но чтоб потом одно слово BREAKBREAK писать

А чем на самом деле goto не устраивает? Твой ассемблерный монстр в прямой форме .
То что goto это маленько плохо не значит что если ты сделаешь то же самое но без букв 'g' и 't' в названии это сразу станет правильным.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[13]: Выйти из двух циклов сразу
От: Hacker_Delphi Россия  
Дата: 17.10.02 02:06
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Я теперь все кому не зслужено, или в отместку ноль залепили буду самую высокую оценку довать. Даже если ответ и не выдающийся, а просто верный. Так что перед тем как сделать пакость, человеку луше подумать.


Я думаю, что лучше ввести фичу с комментариями к нулям, которую в форуме RSDN обсуждали — конструктивнее...
а оценки без правильных комментариев перевешивать на того, кто их ставил
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Выйти из двух циклов сразу
От: Pushkin Россия www.linkbit.com
Дата: 17.10.02 06:32
Оценка:
Здравствуйте Anatolix, Вы писали:

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



A>А чем на самом деле goto не устраивает? Твой ассемблерный монстр в прямой форме .

A>То что goto это маленько плохо не значит что если ты сделаешь то же самое но без букв 'g' и 't' в названии это сразу станет правильным.

1) слово breakbreak лучше показывает, что происходит на самом деле
2) не надо дебильное имя для метки придумывать
3) не надо уродовать левый, красиво отформатированный край текста кривым зубом метки
4) цикл заканчивается строкой с закрывающей скобкой — если перенести куда надо или удалить, можно не спотыкаться

да на самом деле и ДА, не устраивают меня буковки 'g' и 't' !!!
не хочу я использовать штык-нож для открывания банок с горошком !!!
Re[4]: Выйти из двух циклов сразу
От: Anton V. Kolotaev  
Дата: 17.10.02 06:39
Оценка:
Здравствуйте Pushkin, Вы писали:

P>1) слово breakbreak лучше показывает, что происходит на самом деле


Хорошо, а как ты будешь из 3, 4 циклов выходить? А из n?
Re[5]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 17.10.02 13:14
Оценка:
Здравствуйте Anton V. Kolotaev, Вы писали:

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


P>>1) слово breakbreak лучше показывает, что происходит на самом деле


AVK>Хорошо, а как ты будешь из 3, 4 циклов выходить? А из n?


breakbreakbreak\breakbreakbreakbreak Непозиционная система исчисления... Как римские цифры.
Почетный кавалер ордена Совка.
Re[6]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 17.10.02 13:17
Оценка:
AVK>>Хорошо, а как ты будешь из 3, 4 циклов выходить? А из n?

P>breakbreakbreak\breakbreakbreakbreak Непозиционная система исчисления... Как римские цифры.


Это намного хуже чем "goto метка" или "break метка", т.к. при добавлении/удалении промежуточных циклов будет разъежаться весь код.
Re[8]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 17.10.02 13:50
Оценка:
Здравствуйте Anton V. Kolotaev, Вы писали:

AVK>По-моему, проблема настолько надумана, что и яйца выеденного не стоит. Имхо наличие вложенных циклов говорит, скорей всего, о непроработанности дизайна. Например, если ищется элемент в n-мерном массиве, то должно быть не n циклов, а 1 по переменной типа составного итератора.


А если это был не двухмерный массив, а коллекция, элементы которой тоже содержать коллекции?

foreach(Item item in Items)
{
  foreach (ChildItem childItem in item.ChildItems)
  {
    if (childItem.IsBad)
      break;

  }
}


Каждый раз под такую фигню писать хитрый итератор?
И код от этого станет более структурированным?
А если нужен более хитрый обход, например, с возратами и т.д., а не просто последовательный?
Re[9]: Выйти из двух циклов сразу
От: Anton V. Kolotaev  
Дата: 17.10.02 13:57
Оценка:
Здравствуйте DarkGray, Вы писали:


DG>А если это был не двухмерный массив, а коллекция, элементы которой тоже содержать коллекции?

DG>

DG>foreach(Item item in Items)
DG>{
DG>  foreach (ChildItem childItem in item.ChildItems)
DG>  {
DG>    if (childItem.IsBad)
DG>      break;

DG>  }
DG>}
DG>


С++ уже забываем?

DG>Каждый раз под такую фигню писать хитрый итератор?


В идеале — да.

DG>И код от этого станет более структурированным?


Думаю, что да.

DG>А если нужен более хитрый обход, например, с возратами и т.д., а не просто последовательный?


Ага, и итератор — лучшее место, где спрятать эту хитрость.
Re[5]: Выйти из двух циклов сразу
От: Pushkin Россия www.linkbit.com
Дата: 18.10.02 05:47
Оценка:
Здравствуйте Anton V. Kolotaev, Вы писали:

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


P>>1) слово breakbreak лучше показывает, что происходит на самом деле


AVK>Хорошо, а как ты будешь из 3, 4 циклов выходить? А из n?


из трёх breakbreakbreak
хорошо, можно break2, break3 ...
но не break(n), где n-переменная, это я боюсь
по суб'ективной оценке с ростом n на 1 реальная потребность в операторе выхода падает раз в 100
Re[7]: Выйти из двух циклов сразу
От: Pushkin Россия www.linkbit.com
Дата: 18.10.02 06:08
Оценка:
Здравствуйте DarkGray, Вы писали:

AVK>>>Хорошо, а как ты будешь из 3, 4 циклов выходить? А из n?


P>>breakbreakbreak\breakbreakbreakbreak Непозиционная система исчисления... Как римские цифры.


DG>Это намного хуже чем "goto метка" или "break метка", т.к. при добавлении/удалении промежуточных циклов будет разъежаться весь код.


а что "break метка" разве есть?
я что-то в жизни пропустил
этой штуки мне хватило бы
хотя и breakbreak бы неплохо
что вы все на n циклах зациклились :
не бывает их а вот двойные всё-таки встречаются
for(int x=...)
for(int y=...)
Re[10]: Выйти из двух циклов сразу
От: Anton V. Kolotaev  
Дата: 18.10.02 06:43
Оценка:
Здравствуйте VladD2, Вы писали:


VD>Ну тогда в школу... изучать структурное программирование.


Это, похоже, единственная здравая мысль
Re: Выйти из двух циклов сразу
От: Klestov  
Дата: 13.11.02 11:44
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?



while(1)
{
  for(int i = 0; i < 100; i++)
 {
    if(i == 77) goto L1;
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
  }
}
L1:
Re[7]: Выйти из двух циклов сразу
От: Virus-5000  
Дата: 26.03.03 06:19
Оценка:
Здравствуйте, potap, Вы писали:

[покипано модератором]

P>Ну а это, сэр, имхо, банально .


Банально, не банально, а все-таки правильно.
В первом примере две ошибки:
1. Избыточность данных, что приводит к ошибке, если поменять одно значение и забыть поменять другое.
2. Использование переменной вне цикла. Если переносить такой код на другие компиляторы, то не знаешь, какое значение переменной будет по окончании цикла. Так что если писать серьезную прогу, то лучше делать так, как представлено во втором примере.
Re[7]: Выйти из двух циклов сразу
От: Virus-5000  
Дата: 26.03.03 06:22
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>слегка подправить можно

А>
А>  bool bContinue = true;
А>  for(int i = 0; (i < 100) && bContinue; i++)
А>  {
А>    if (i == 77)
А>    {
А>      bContinue = false;
А>      break;
А>    }
А>  }
А>


Ошибочка вышла. Раньше цикл с и перезапускался много раз, а здесь он работает только один раз.
Re[7]: Выйти из двух циклов сразу
От: Virus-5000  
Дата: 26.03.03 06:42
Оценка:
Здравствуйте, Vladik, Вы писали:

V>P.S. Лично я из принципа goto никогда не поставлю (просто рука не поднимется Но увидев чужой кусок кода именно с "таким" goto ничего плохого про написавшего его не подумаю.


Я вообще вспомнил, что есть такой оператор, только зайдя сюда, а так и не вспомнил бы ни за что
Re[3]: Выйти из двух циклов сразу
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.03.03 20:05
Оценка:
Здравствуйте, Mishka<T>, Вы писали:

MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет.


Неправда. Нельзя выбрасывать исключение из деструктора.

C++ Standard, 15.2/3
The process of calling destructors for automatic objects constructed on the path from a try block to a throwexpression is called “stack unwinding.” [Note: If a destructor called during stack unwinding exits with an exception, terminate is called (15.5.1). So destructors should generally catch exceptions and not let them propagate out of the destructor. —end note]


Но в данном случае оно пределы деструктора не покинет. Так что проблем нет. Другое дело, что не стоит использовать исключения направо и налево. В некоторых случаях это уместно, в некоторых нет... Imho, в приведенном примере goto лучше чем throw.
... << RSDN@Home 1.0 beta 6a >>
Re: Выйти из двух циклов сразу
От: 0x64Rm  
Дата: 28.03.03 04:33
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?



Привет! Чаще всего делаю так
BYTE bfStop = 0;

while(!bfStop)
{
  for(int i = 0; (i < 100) && (!bfStop); i++)
  {
                //....... че то где то как то делаем.
        bfStop = 1; // вот так выхожу
  }
}

Плюсы: просто, надежно, и код понятен любому.
с уважением,
Алексей
Re[2]: Выйти из двух циклов сразу
От: 0x64Rm  
Дата: 28.03.03 04:41
Оценка:
еще вариант красивше.


WORD wFunc1()
{
    while(TRUE)
    {
      for(int i = 0; (i < 100); i++)
      {
            return -1; // вот так выхожу
      }
    };
return 0;
};
с уважением,
Алексей
Re[3]: Выйти из двух циклов сразу
От: 0x64Rm  
Дата: 28.03.03 04:59
Оценка:
пардон Господа, не заметил аж 15 страниц начиная с 1
с глубокой отладки только вернулся
с уважением,
Алексей
Re[8]: Выйти из двух циклов сразу
От: scorpio_cat Россия  
Дата: 31.03.03 05:43
Оценка:
Здравствуйте, Virus-5000, Вы писали:

V5>Я вообще вспомнил, что есть такой оператор, только зайдя сюда, а так и не вспомнил бы ни за что


... << RSDN@Home 1.0 beta 6a >>
Re[18]: Выйти из двух циклов сразу
От: Аноним  
Дата: 18.04.03 12:56
Оценка:
Отвернись — я пока напечатаю ...
Re: Выйти из двух циклов сразу
От: Andrusha  
Дата: 19.04.03 19:58
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?

bool b = true;
while(b)
{
  for(int i = 0; i < 100; ++i)
  {
    if(i == 77)
    {
      b = false;
      break;
    }
  }
}

Я бы так написАл...
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Выйти из двух циклов сразу
От: Areex  
Дата: 20.04.03 09:57
Оценка:
Здравствуйте, Andrusha, Вы писали:

A>bool b = true;

A>while(b)
A>{
A> for(int i = 0; i < 100; ++i)
A> {
A> if(i == 77)
A> {
A> b = false;
A> break;
A> }
A> }
A>}
A>[/ccode]
A>Я бы так написАл...

У вас какие-то релегиозные счеты с goto?
этож надо так извращаться.
"A sign labeled `pit'? I walk up to it."
Re[3]: Выйти из двух циклов сразу
От: Аноним  
Дата: 20.04.03 11:42
Оценка:
Здравствуйте, Areex, Вы писали:

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


A>bool b = true;

A>while(b)
A>{
A> for(int i = 0; i < 100; ++i)
A> {
A> if(i == 77)
A> {
A> b = false;
A> break;
A> }
A> }
A>}
A>[/ccode]
A>Я бы так написАл...

A>У вас какие-то релегиозные счеты с goto?

A>этож надо так извращаться.


Просто большинство народу думает шблонами совершенно не прикладывая интеллекта: все говорят goto это для ламеров ну и вот чтоб не ударить в грязь лицом смело повторяют "goto это для ламеров".
Re[3]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 20.04.03 19:28
Оценка:
Здравствуйте, Areex, Вы писали:

A>У вас какие-то релегиозные счеты с goto?

A>этож надо так извращаться.

Лично у меня нет. Но необходимости в этом слове у меня давно не наблюдается.
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Выйти из двух циклов сразу
От: Andrusha  
Дата: 21.04.03 18:34
Оценка:
Здравствуйте, Areex, Вы писали:

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


A>>bool b = true;

A>>while(b)
A>>{
A>> for(int i = 0; i < 100; ++i)
A>> {
A>> if(i == 77)
A>> {
A>> b = false;
A>> break;
A>> }
A>> }
A>>}
A>>
A>>Я бы так написАл...

A>У вас какие-то релегиозные счеты с goto?

A>этож надо так извращаться.

Та нее, но, если я не ошибаюсь, то такой код всего лишь один дополнительный такт,
процессора на одну итерацию. Зато сразу видно куда, мы попадаем после завершения цикла, и не надо искать куда goto собственно смотрит.

Насчёт религии...
Сколько пишу проги, пока не было не одного случая когда пришлось специально извращаться, что бы избавиться от goto — хотя я может уже сразу без него мыслю.
... << RSDN@Home 1.0 beta 6a >>
Re[4]: Выйти из двух циклов сразу
От: Areex  
Дата: 22.04.03 09:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


A>>У вас какие-то релегиозные счеты с goto?

A>>этож надо так извращаться.

WH>Лично у меня нет. Но необходимости в этом слове у меня давно не наблюдается.


Это как посмотреть. break и Co это вырожденный случай goto, только метки не требует.
Следует медитировать по просветления, что вырожденный случай так же читабелен как и общий.
В качестве мантры можете читать Стауструпа.
"...Одно из немногих разумных применений состоит в выходе из вложенного цикла или переключателя (break лишь прекращает выполнение самого внутреннего охватывающего его цикла или переключателя). Например:..."
"Come on, we haven't found any traps so far."
Re[5]: Выйти из двух циклов сразу
От: WFrag США  
Дата: 22.04.03 10:20
Оценка:
Здравствуйте, Areex, Вы писали:

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


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


A>>>У вас какие-то релегиозные счеты с goto?

A>>>этож надо так извращаться.

WH>>Лично у меня нет. Но необходимости в этом слове у меня давно не наблюдается.


A>Это как посмотреть. break и Co это вырожденный случай goto, только метки не требует.

A>Следует медитировать по просветления, что вырожденный случай так же читабелен как и общий.
A>В качестве мантры можете читать Стауструпа.
A>"...Одно из немногих разумных применений состоит в выходе из вложенного цикла или переключателя (break лишь прекращает выполнение самого внутреннего охватывающего его цикла или переключателя). Например:..."
A>


A>


A>


Кстати, а почему бы тогда не сделать: break n, где n — уроаень вложенности. По-моему в каком-то языке так и есть (PHP?)
... << RSDN@Home 1.0 beta 6a >>
Re[6]: Выйти из двух циклов сразу
От: Areex  
Дата: 22.04.03 11:53
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Кстати, а почему бы тогда не сделать: break n, где n — уроаень вложенности. По-моему в каком-то языке так и есть (PHP?)


А нахрена, если уже есть goto? Сейчас уже позняк метаться.
К тому же метка уж сто пудово нагляднее, чем вложенности считать.
"Ok, the dragon's asleep. You guys wait back here with bows and stuff. Getafix and I will go up in front of it and cast light on it's eyes to blind him, then we'll blow his brains out with psionics."
Re[5]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 22.04.03 18:06
Оценка:
Здравствуйте, Areex, Вы писали:

A>Это как посмотреть. break и Co это вырожденный случай goto, только метки не требует.

Тут надо смотреть но скорее всего я вынесу это в отдельную функцию и воспользуюсь return'ом.
Вобще последнее время мои программы это куча мелких в основном шаблонных классов с несколькими мелкими часто шаблонными функциями.
Это я к тому что когда функция ~10 строк то goto не к чему.
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: А зайти?
От: WolfHound  
Дата: 22.04.03 18:06
Оценка:
Здравствуйте, folk, Вы писали:

F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов.

F>Как вы это обычно делаете?
Нууу.... Как бы тебе сказать.....
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Выйти из двух циклов сразу
От: Areex  
Дата: 23.04.03 06:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


A>>Это как посмотреть. break и Co это вырожденный случай goto, только метки не требует.

WH>Тут надо смотреть но скорее всего я вынесу это в отдельную функцию и воспользуюсь return'ом.
WH>Вобще последнее время мои программы это куча мелких в основном шаблонных классов с несколькими мелкими часто шаблонными функциями.
WH>Это я к тому что когда функция ~10 строк то goto не к чему.

Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно. Следовательно ни о каком исключении goto из программ и речи быть не может.
Использование же специальных конструкций для того, что бы избежать goto, есть ни что иное как победа догм над здравым смыслом. Я тут почитал всю ветку, над пёрлами типа throw рыдал просто. Нет, что бы придумать конструкцию, когда от goto избавляться не надо. Я в общем с паталогом согласен, на 100%.
"Why is your torch flame turning blue?"
Re[6]: Выйти из двух циклов сразу
От: Plague Россия 177230800
Дата: 23.04.03 06:31
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Кстати, а почему бы тогда не сделать: break n, где n — уроаень вложенности. По-моему в каком-то языке так и есть (PHP?)


а ежели добавишь вложенность, то давай искать break n, чтоб поправить, помоему не удачно спроектированный язык, появляется потенциальная возможность появления ошибок, надо постоянно понить есть ли во вложенном коде break!
... << RSDN@Home 1.0 beta 6 >>
Re[8]: Выйти из двух циклов сразу
От: Areex  
Дата: 23.04.03 14:23
Оценка:
Здравствуйте, eaa, Вы писали:

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


A>>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно.

eaa>Как можно неявно использовать goto? Или есть goto в коде или нет, а то что оно возможно разложиться в один код, так это только твои догадки...

while(1)
{
    if (a!=b) break;
    else goto out_of_cycle;
}
out_of_cycle:


Нади отличие. Догадки блин...
"Come on, we haven't found any traps so far."
Re[9]: Выйти из двух циклов сразу
От: WFrag США  
Дата: 23.04.03 14:49
Оценка:
Здравствуйте, Areex, Вы писали:

A>Нади отличие. Догадки блин...


Может еще вот так?
while(1)
{
    // some code
}

и

cycle:
    // same some code
goto cycle;


А еще через goto можно разложить if, do...while, и.т.д.

Так что это не аргумент. goto есть goto, а не break, continue,...
... << RSDN@Home 1.0 beta 6a >>
Re[10]: Выйти из двух циклов сразу
От: Areex  
Дата: 23.04.03 14:58
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>А еще через goto можно разложить if, do...while, и.т.д.


WF>Так что это не аргумент. goto есть goto, а не break, continue,...


Читай внимательнее. break это goto, а не goto это break.
Причем тут твой пример я вообще не понял.
"We'll untie the prisoners and lock them in the closet."
Re[3]: А зайти?
От: Les Россия  
Дата: 23.04.03 15:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов.

F>Как вы это обычно делаете?
WH>Нууу.... Как бы тебе сказать.....

ИМХО, всю эту ветку давно пора в "Юмор"
Re[9]: Выйти из двух циклов сразу
От: eaa Украина  
Дата: 23.04.03 16:26
Оценка:
Здравствуйте, Areex, Вы писали:

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


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


A>>>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно.

eaa>>Как можно неявно использовать goto? Или есть goto в коде или нет, а то что оно возможно разложиться в один код, так это только твои догадки...

A>
A>while(1)
A>{
A>    if (a!=b) break;
A>    else goto out_of_cycle;
A>}
A>out_of_cycle:
A>


A>Нади отличие. Догадки блин...

Ну начнём с простого там написано goto там break

while(a)
{
a=false;
}
это тоже неявный goto?

то что break можно заменить goto не значит что это одно и тоже. Можно ведь все циклы заменить goto...
... << RSDN@Home 1.0 beta 6a >>
Re[10]: Выйти из двух циклов сразу
От: Areex  
Дата: 23.04.03 17:11
Оценка:
Здравствуйте, eaa, Вы писали:

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



A>>Нади отличие. Догадки блин...

eaa>Ну начнём с простого там написано goto там break

Очевидно, что имелось ввиду логическое отличие.

eaa>while(a)

eaa>{
eaa> a=false;
eaa>}
eaa>это тоже неявный goto?

eaa>то что break можно заменить goto не значит что это одно и тоже. Можно ведь все циклы заменить goto...


Это эпидемия или теперь модно книжек не читать? goto это безусловный переход. while это безусловный переход? Детский сад блин.
В общем все это уже переосло в непотребный флейм, к тому же в этой ветку уже все много раз сказали, я завязываю, выходите из цикла по throw, если вам так больше нравится.
"Rakshasas? Quick, break out the poisoned bolts."
Re[4]: А зайти?
От: folk Россия  
Дата: 23.04.03 23:47
Оценка:
Здравствуйте, Les, Вы писали:

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


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


F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов.

F>Как вы это обычно делаете?
WH>Нууу.... Как бы тебе сказать.....

Les>ИМХО, всю эту ветку давно пора в "Юмор"


Вот и я про то же
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[7]: Выйти из двух циклов сразу
От: Plague Россия 177230800
Дата: 24.04.03 07:36
Оценка:
Здравствуйте, Areex, Вы писали:

A>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно. Следовательно ни о каком исключении goto из программ и речи быть не может.

A>Использование же специальных конструкций для того, что бы избежать goto, есть ни что иное как победа догм над здравым смыслом. Я тут почитал всю ветку, над пёрлами типа throw рыдал просто. Нет, что бы придумать конструкцию, когда от goto избавляться не надо. Я в общем с паталогом согласен, на 100%.

IMHO? проблема не в том ка goto работает, а насколько читабельны программы с goto. Т.е. получается так называемы "spagetti code". Да, теоретически, повышается читабельность программы, где при выходе из вложенных циклов используется goto, в небольших циклах. Также бытует мнение, что целесообразно использование goto в функциях, повышает не только читабельность но и логичность, функция всегда завершается в определенном месте, а значит не надо искать окончание функции по всему коду:

f()
{
    // start code
    if(rand()%1)
    {
        // ...
        goto end;
        // ...
    }
    else
    {
        // ...
        goto end;
        // ...
    }
    end:
    // end code...
}


Но при всем при этом я не сторонник goto! считайте это религией... мои доводы:
Потенциальная сложность программы увеличивается при использовании в ней дополнительных ключевых слов. Плюс, логика программы становиться странноватой, т.к. приводит к использованию goto и break совместно, как бы параллельно.
Если весь текст цикла умещается на экране, зачем использовать goto, а если — нет, то я сомневаюсь что при использовании получится явное преимущество. Как тот, кто будет читать вашу программу поймет, не видя цикл целиком, куда ведет goto? По имени метки? Вед главный довод goto в читабельности, по сравнени с break, и то, что у goto нет никакой связи с операторами циклов, портит ему всю "малину".
Для большого числа вложенных циклов я вообще рекоммендую пересмотреть алгоритм. Применение goto очень часто приводит к более широкому его использованию, т.е. в следствие редактирования программы с этими операторами есть опасность, что получиться "spagetti code" в попытке внести минимум изменений.
В конечном итоге: есть комментарии которые неплохо было бы расставлять в таких местах, чтоб не забыть, что здесь происходит.

Так, что я продолжу не прибегать к использованию goto в своих программах. Ну, может быть, на сверх крайний случай.
... << RSDN@Home 1.0 beta 6 >>
Re: Выйти из двух циклов сразу
От: little_alex  
Дата: 15.09.04 13:06
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


Если Perl
OUT:while(1)
{
   for(0..100)
   {
      if($_ eq 77) break OUT;
   }

}

Внимание OUT- это не метка а ИМЯ цикла
Не сказать что Perl способствует построению читабельных программ ,
но это то что мне не хватает в др. языках

LG>Как это сделать?
Re: Выйти из двух циклов сразу
От: black hermit Россия  
Дата: 15.09.04 13:16
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?

Очень просто
bool flag = true;
while(flag)
{
  for(int i = 0; i < 100 && flag; i++)
  {
    if(i == 77)
      flag=false;
  }
}
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re[2]: Выйти из двух циклов сразу
От: eugals Россия  
Дата: 15.09.04 17:28
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Если Perl

Раз пошла такая пьянка...
Если Python, то так:
while True:
    for i in xrange( 0, 100):
        if i == 77:
            break
    else:
        continue
    break

... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: Выйти из двух циклов сразу
От: Laurel  
Дата: 16.09.04 06:34
Оценка:
Здравствуйте, little_alex, Вы писали:

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




LG>>
LG>>while(1)
LG>>{
LG>>  for(int i = 0; i < 100; i++)
LG>>  {
LG>>    if(i == 77)
LG>>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>>  }
LG>>}
LG>>


_>Если Perl

_>
_>OUT:while(1)
_>{
_>   for(0..100)
_>   {
_>      if($_ eq 77) break OUT;
_>   }

_>}
_>


Если память мне не изменяет в java также допустим синтаксис
break [<имя цикла>]
continue [<имя цикла>]

А в С/С++ допустимо для этого использовать goto.
Опять же если память мне не изменяет Страуструп об этом писал, хоть и неохотно.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Выйти из двух циклов сразу
От: hrg Россия  
Дата: 16.09.04 08:33
Оценка:
little_alex -> "Re: Выйти из двух циклов сразу" :

la> Если Perl

la>
 la> OUT:while(1)
 la> {
 la>    for(0..100)
 la>    {
 la>       if($_ eq 77) break OUT;
 la>    }

 la> }
 la>

la> Внимание OUT- это не метка а ИМЯ цикла
la> Не сказать что Perl способствует построению читабельных программ ,
la> но это то что мне не хватает в др. языках

Мда.... докатились до goto... позор


my $_continue=1;

while($_continue){
    for(0..100){
        $_continue=1 if($_ eq 77) ;
    }
}



Yury Kopyl aka hrg | http://id.totem.ru | "мы не пьем — мы лечимся..."
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 16.09.04 14:01
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:


SYG>Чтобы получить подобный эффект в доисторическом языке программирования Си

с "доисторическим" поосторожнее
а то ведь и нам лексикона хватит оберон обругать

SYG>для этого цикла заведите отдельную функцию:

SYG>Оператор return будет выбрасывать из любого количества вложенных циклов.

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

предлагаешь объявлять функцию с 20 аргументами?
или объявлять 20 глобальных переменных?
или объявить класс (если это С++ или java, а не С), членами которого будут эти 20 переменных, специально lzk этого вложенного цикла?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Выйти из двух циклов сразу
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 17.09.04 06:54
Оценка:
Здравствуйте, jazzer, Вы писали:

J>предлагаешь объявлять функцию с 20 аргументами?


Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.
Варианты решения этой проблемы не уменьшающие быстродействия программы:
1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.
2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.
3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.
Re[6]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 17.09.04 07:34
Оценка:
Здравствуйте, prVovik, Вы писали:

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



J>>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.

V>Кривой дезайн. Что тут можно поделать? Ответ напрашивается сам собой...

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

только вот реальный мир несколько сложнее, и реальные задачи отнюдь не всегда оказываются легко разложимыми на составляющие

большинство научных вычислительных задач именно таковы

J>>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления

V>Совершенно верно, звучания недостаточно. Необходимо, как минимум, применение.
пример, пожалуйста, применения для озвученного случая
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 17.09.04 07:43
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

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



SYG>Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.

SYG>Варианты решения этой проблемы не уменьшающие быстродействия программы:
SYG>1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.

чушь какая — "неструктурная инструкция".
инструкция — это просто инструкция, она не бывает структурной или неструктурной.
бывает ее неструктурное использование.
никто не мешает на асме писать объектно-ориентированные и структурные программы, используя goto ( в смысле, jmp etc.)
сложнее — да, но если спуститься с академических небес на землю и использовать имеющиеся средства (обычно очень ограниченные по независящим от программиста причинам), то как ты их будешь использовать — вопрос исключительно твоей внутренней культуры и дисциплины программированиия.

тот же X/Motif написан на чистом С — исключительно объектно-ориентированная система.

SYG>2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.

повторю вопрос:
J>>предлагаешь объявлять функцию с 20 аргументами?

пиар skipped
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Выйти из двух циклов сразу
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 17.09.04 08:16
Оценка:
Здравствуйте, jazzer, Вы писали:

J>повторю вопрос:

J>>>предлагаешь объявлять функцию с 20 аргументами?

Повторяю ответ:
http://www.rsdn.ru/Forum/Message.aspx?mid=812536&amp;only=1
Автор: S.Yu.Gubanov
Дата: 17.09.04


Кстати, если не нравятся 20 аргументов, то заведи один — структуру из 20 записей.
Re[6]: Выйти из двух циклов сразу
От: AndrewJD США  
Дата: 17.09.04 08:57
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Кстати, если не нравятся 20 аргументов, то заведи один — структуру из 20 записей.


Если этот цикл вызывается миллионы раз, этим мы добавим лишние тормоза. А если функцию надо вызвать 2-10 раз с новыми параметрами?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: Выйти из двух циклов сразу
От: Kluev  
Дата: 17.09.04 10:03
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.

SYG>Варианты решения этой проблемы не уменьшающие быстродействия программы:
SYG>1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.
SYG>2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.

SYG>3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.


LOL! С плюсов на оберон . А БЕГИН-ЭНД мы не запаримся нибивать? А вместо шаблонов, что использовать будем? Думаю, что такое предложение, мягко говоря, не вызовет энутузиазма у C/C++ программеров
Re[5]: Выйти из двух циклов сразу
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 17.09.04 11:06
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Здравствуйте, S.Yu.Gubanov, Вы писали:


K>LOL! С плюсов на оберон . А БЕГИН-ЭНД мы не запаримся нибивать?


А где Вы в Обероне BEGIN-ы увидели? Там BEGIN встречается только в начале тела процедуры или тела модуля. Больше BEGIN-нов там нет. Все остальные синтаксические конструкции построены по контекстно свободной грамматике.
IF b THEN s END;
FOR i:=0 TO 10 DO s END;
WHILE b DO s END;
LOOP s END;
WITH a:T DO s END
Так что BEGIN-ы писать не запаритесь.

K>А вместо шаблонов, что использовать будем?


Слава богу, шаблонов в обычном обероне нет. Но если они Вам так нравятся, то можете использовать версию оберона с шаблонами. Или Вы не знали что есть версия Оберона c шаблонами?
Re[4]: Выйти из двух циклов сразу
От: Laurel  
Дата: 17.09.04 12:36
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.


У червей нет блох, а вот если бы были... (С) Старый анекдот.
... << RSDN@Home 1.1.3 stable >>
Re[8]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 17.09.04 15:00
Оценка:
Здравствуйте, prVovik, Вы писали:

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


J>>что угодно можно обозвать кривым дизайном

J>>было бы, конечно, здорово, если бы все задачи были простыми и укладывались в простые диаграммы с очевидной логикой
V>А для чего было придумано другое умное слово: "декомпозиция". Причем придумано оно уже довольно давно, вовсю используется, даже существуют различные методологии этой самой декомпозиции, как ты думешь, к чему все это? Да, я понимаю, что существует еще другое слово "оптимизация", и, как правило, оно сильно конфликтует с простотой и очевидностью кода, но и на оптимизацию есть стоя управа в виде профайлера. А во время разработки рекомендуется забивать на оптимизацию в пользу простоте и очевидности.

если я обижусь на изложение банальностей, я буду правильно понят? ;)

J>>только вот реальный мир несколько сложнее, и реальные задачи отнюдь не всегда оказываются легко разложимыми на составляющие

V>А кто говорил, что все будет просто? Это и есть искусство проектирования ПО.

я точно не говорил :)

J>>большинство научных вычислительных задач именно таковы

V>Зато они четко формализованы

ага. возьми любой алгоритм из линейной алгебры.

J>>пример, пожалуйста, применения для озвученного случая

V>Почитай Фаулера "Рефакторинг". У него там примеров полно.

вот ты думаешь, что все тут лохи и никто фаулера не читал и слова "декомпозиция" и "рефакторинг" не слышал? ;)

поверь, я говорю не с потолка, а из собственного опыта.
И мне встречалось множество примеров, когда рефакторинг никак не пристегнешь.
Хотя, конечно, обратных примеров неизмеримо больше.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Выйти из двух циклов сразу
От: Undying Россия  
Дата: 17.09.04 18:00
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Ну почему же? Очень даже получится... Если переменная используется один раз, то вместо нее можно вставить вызов ф-ции, производящей расчет значения этой переменной, подобно тому, как это делалось при её инициализации.


Полностью согласен. Об этом способе я не подумал.
... << RSDN@Home 1.1.2 stable >>
Re[10]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 20.09.04 07:08
Оценка:
Здравствуйте, prVovik, Вы писали:

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


J>>если я обижусь на изложение банальностей, я буду правильно понят? ;)

V>Просто тут начали говорить, что параметры в структурах — это дополниельный оверхед и пр. и поэтому это не надо использовать... С чем я не согласен.

просто, имхо, овчинка выделки не стоит.
заводить кучу структур параметров, классов — контейнеров локальных переменных, и т.д. и т.п., — и все ради того, чтобы ни в коем случае не использовать "неструктурную инструкцию" (термин — шедевр просто :) ) goto для выхода из вложенного цикла — согласись, звучит абсурдно.

V>>>Зато они четко формализованы

J>>ага. возьми любой алгоритм из линейной алгебры.
V>Если забить на оптимизацию, писать код по принципу: главное чтобы было просто и работало, думаю, особых проблем с линейной алгеброй не будет.

я не готов жертвовать производительнотью кода в угоду красоте дизайна :)

J>>вот ты думаешь, что все тут лохи и никто фаулера не читал и слова "декомпозиция" и "рефакторинг" не слышал? ;)

V>Фаулера я упомянул, чтобы отмазаться от примеров, а про декомпозицию — это у меня был типа сарказм... :shuffle:

J>>И мне встречалось множество примеров, когда рефакторинг никак не пристегнешь.

V>Поделись. Мне интересно. Правда.

вычислительные задачи: упомянутая линейная алгебра, решение 3-мерного диффузионно-дрейфового уравнения + уравнения Пуассона, и т.д. и т.п.: я всех уже не упомню.

хотя я видел красивые решения с кучей виртуальных вызовов, наследованиями и интерфейсами..

Когда красивый код считает 8 часов, а некрасивый — четыре, — угадай, что я выберу :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Выйти из двух циклов сразу
От: Kluev  
Дата: 20.09.04 07:25
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Слава богу, шаблонов в обычном обероне нет. Но если они Вам так нравятся, то можете использовать версию оберона с шаблонами. Или Вы не знали что есть версия Оберона c шаблонами?


Да честно говоря и узнавать не собирался, зачем? Не люблю я паскале-подобные языки. Хотя с паскаля начинал в свое время.
Re[2]: Выйти из двух циклов сразу
От: MEOW Россия  
Дата: 20.01.05 05:55
Оценка:
Здравствуйте, OlegO, Вы писали:

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



LG>>Как это сделать?


OO>Например сгенерить исключение:


OO>
OO>try
OO>{
OO>   while(1)
OO>   {
OO>     for(int i = 0; i < 100; i++)
OO>     {
OO>       if(i == 77)
OO>          throw 77;
OO>     }
OO>   }
OO>}
OO>catch(int e)
OO>{
OO>   // e==77
OO>}
OO>



По-моему, исключения стоит использовать для исключительных ситуаций. А здесь не проще ли так:

bool fCondition = true;

while( fCondition )
{
for(int i = 0; i < 100; i++)
{
if(i == 77)
{
fCondition = false;
break;
}
}
}
Re[18]: Выйти из двух циклов сразу
От: Erop Россия  
Дата: 02.06.06 16:33
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Ну это уже демагогия пошла — аналогия совершенно некорректная. Попробуй на С++ писать как на прологе.

Ты Loki, например, видел?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Выйти из двух циклов сразу
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 05.06.06 07:51
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

LG>>я вот как раз и не хочу через исключения. И не хочу гоу-ту.

LG>>Чего делать?

ANS>1. Не делать два цикла.

ANS>2. Не выходить из циклов.

Забыл 3-й вариант — использовать return.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[6]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.06.06 23:05
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>>1. Не делать два цикла.

ANS>>2. Не выходить из циклов.

ANS>Забыл 3-й вариант — использовать return.


Забыл четвертый... не использовать циклов!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Выйти из двух циклов сразу
От: mike_sikalo Украина  
Дата: 13.06.06 09:03
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


вынеси в отдельную процедуру и напиши return
Re: Выйти из двух циклов сразу
От: _doctor Финляндия http://agilesoftwaredevelopment.com
Дата: 15.06.06 07:52
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:

LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


Лично я стараюсь переписывать куски кода, которые мне не очень нравятся как-то по другому (структурно). Например, так:
/**
* @return true when no more cycles are needed
*/
bool doAtomicProcessing()
  {
  for(int i = 0; i < 100; i++)
    {
    if(i == 77)
      return true
    }
  return false;
  }
  
bool exit = false;
do exit = doAtomicProcessing 
    while (!exit);
Chief Software Engineer,
Scrum Master, Symbian
Re[2]: Выйти из двух циклов сразу
От: waddayamin  
Дата: 15.06.06 10:34
Оценка:
Здравствуйте, Pushkin, Вы писали:


P>Безумно высокое количество откликов на этот в общем-то невинный вопрос говорит о том,

P>что он попал в больное место — НУ НЕТ здесь нормального способа выйти.
P>Почему бы нам всем не признать, что разработчики языка лоханулись, и просто ЗАБЫЛИ
P>дать нам эту возможность.
P>Ведь это было так просто — какое-нибудь ключевое слово типа breakbreak или break2.
P>Предлагаю написать возмущённое письмо

P>ЗЫ: Меня давно мучит вопрос, а нельзя ли это как-то своими силами сделать —

P>задефайнить как-нибудь, пусть даже и монстра какого-нибудь ассемблерного,
P>но чтоб потом одно слово BREAKBREAK писать

По-моему, самый надёжный способ выйти из двух циклов — выйти по грамотно заданному условию, а не плодить говнище while true do, а потом спрашивать, а как мне из него выйти... =)
Re[7]: Выйти из двух циклов сразу
От: Quintanar Россия  
Дата: 15.06.06 10:50
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Andrei N.Sobchuck, Вы писали:


ANS>>>1. Не делать два цикла.

ANS>>>2. Не выходить из циклов.

ANS>>Забыл 3-й вариант — использовать return.


VD>Забыл четвертый... не использовать циклов!


5) использовать continuations


....
call/cc exit {
   while (..) {
     ...
     while (..) {
       ...
       exit 0;
     }
     ...
   }
}

или

reset {
   while (..) {
     ...
     while (..) {
       ...
       shift { };
     }
     ...
   }
}
Re[8]: Выйти из двух циклов сразу
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 15.06.06 11:55
Оценка:
Здравствуйте, Quintanar, Вы писали:

ANS>>>>1. Не делать два цикла.

ANS>>>>2. Не выходить из циклов.

ANS>>>Забыл 3-й вариант — использовать return.


VD>>Забыл четвертый... не использовать циклов!


Q>5) использовать continuations


Хе-хе. Я это и подразумевал под п.2.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.