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