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[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[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>Да никто вроде не говорил.


Влад, Вы... ах да... ты придираешься к словам...
Голь на выдумку хитра, однако...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.