Здравствуйте 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.