Re[2]: BOOST vs BICYCLE
От: Vzhyk  
Дата: 10.12.06 19:12
Оценка:
Аноним wrote:
>
> Дмитрий, ты совершил потрясающее количество ошибок общего характера,
> которые не только поставили под угрозу твой проект, но и привели к
> дестабилизации твоей психики. На месте boost'а могла быть любая другая
> сравнимая по сложности библиотека (в использовании которой у тебя
> минимум опыта), и у тебя были бы абсолютно такие же проблемы. Надеюсь,
> этот случай будет тебе хорошим уроком. В следующий раз будь поумней и
> научись оценивать риск своих решений перед тем, как бросаться в омут с
> головой.
Киньте в меня камень, кто не делает ошибок. Не всегда (и чаще почти
никогда не возможно оченить риск). В частности, проект, что я сейчас
делаю, с целью уменьшения временных затрат, а максимально использовал
буст вместо собственных велосипедов. Использование велосипедов от буста
сэкономило мне около 3 человеко-недель рабочего времени (эти велосипеды
не идеальны, кое где надо учитывать баго-фичи, или мои ручки, странности
при сборке буста 2005-й студией). Так же будет и с любой другой
библиотекой. Просто надо учитывать, что все библиотеки пушутся людьми, а
людям свойственно делать ошибки.
Posted via RSDN NNTP Server 2.0
Re: BOOST vs BICYCLE
От: SP_ Украина  
Дата: 28.01.07 12:04
Оценка: :)
Свои 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
День угрохал, на свой код грешил !!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.