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[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[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[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[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[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[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[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 если Билл этого делать
нехочет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.