Аноним wrote:
>
> Дмитрий, ты совершил потрясающее количество ошибок общего характера,
> которые не только поставили под угрозу твой проект, но и привели к
> дестабилизации твоей психики. На месте boost'а могла быть любая другая
> сравнимая по сложности библиотека (в использовании которой у тебя
> минимум опыта), и у тебя были бы абсолютно такие же проблемы. Надеюсь,
> этот случай будет тебе хорошим уроком. В следующий раз будь поумней и
> научись оценивать риск своих решений перед тем, как бросаться в омут с
> головой.
Киньте в меня камень, кто не делает ошибок. Не всегда (и чаще почти
никогда не возможно оченить риск). В частности, проект, что я сейчас
делаю, с целью уменьшения временных затрат, а максимально использовал
буст вместо собственных велосипедов. Использование велосипедов от буста
сэкономило мне около 3 человеко-недель рабочего времени (эти велосипеды
не идеальны, кое где надо учитывать баго-фичи, или мои ручки, странности
при сборке буста 2005-й студией). Так же будет и с любой другой
библиотекой. Просто надо учитывать, что все библиотеки пушутся людьми, а
людям свойственно делать ошибки.
Posted via RSDN NNTP Server 2.0
Свои 5 копеек вставлю, можи кому пригодиться
boost 1_33_1
MSVC8
using namespace boost;
using namespace std;
typedef int32_t IntType;// аналогичное поведение для int8_t int16_t int64_t
uniform_int<IntType> ui(numeric_limits<IntType>::min(), numeric_limits<IntType>::max());
rand48 rng;
variate_generator<rand48, uniform_int<int32_t> > gen(rng, ui);
IntType x = gen(); //и вот тут мы влетаем в бесконечный цикл
В документации — ни слова. В рантайме — ни ассерта, ни ексепшена.
Если уменьшить диапазон хотя бы на 1 в любую сторону — работает.
Если заменить
typedef intXX_t IntType;
на
typedef uintXX_t IntType;
снова все работает !!!
Полез вовнутрь.
uniform_int.hpp
template<class IntType = int>
class uniform_int
{
public:
....
typedef IntType result_type;
....
explicit uniform_int(IntType min = 0, IntType max = 9)
: _min(min), _max(max)
{
......
assert(min <= max); //хха, типа "проверились". Как бы не так
init();
}
private:
result_type _min, _max, _range;
void init()
{
_range = _max - _min;// для знаковых типов с максимально возможными диапазонами тут получим.... конечно же -1 !!!!!!
}
......
};
дальше этот _range используется в расчетах, одним глазом посмотрел но не вникал особо.
Фикс простой, либо range сделать беззнаковым, либо ассерт заменить на range>=0
День угрохал, на свой код грешил !!!