Category: происшествия

nyaload

Смезда Сверти

Есть табличка сравнения размеров космических кораблей, на ней не хватает Звезды Смерти.

Пририсовал : http://dobrokot.ru/pics/i2015-04-18__15-38-08_2011kb.jpg

Звезд Смерти - две штуки. Первая рабочая - 160км в диаметре (для рисунка выбрал её размер), вторая недостроеная - точно неясно, 200-900 км.

Картинки для коллажа взяты отсюда: много разных космических кораблей, инфографика по DeathStar, нарисованная Death Star
nyaload

MayBe C++

Вот храним мы в переменной целое число. Иногда нам надо хранить не число, а факт того, что числа вообще нет. Например, функция пересечения двух линий хочет сообщить что нет точки пересечения вообще. Часто для этой цели используют "особые" значения которые вроде как бессмысленные. Например, -1 для int, или пустая строка для std::string.

Иногда делают баги, и забывают написать if на проверку бессмысленности значения. "Бессмысленное" значение вырывается в мир, и начинает участвовать в арифметических операциях или становится "особым" значением уже в другом месте.

Для того что бы явно записать факт "иногда тут ничего нет" используется обёртка над типом, внутри которой хранится булевский флажок. В boost есть тип boost::optional<T>. В Haskell есть Maybe T. В C# есть Nullable (для встроенных типов).


Хороший пример, почему лучше иметь тип в котором особое состояние "нету никакого int вообще": cначала человек получает -1 из системной функции типа getpid, а затем эта -1 попадает в killall. Смерть, разрушения, мертвый мак.

Есть ещё мой велосипед для C++, когда не хочется boost, без вложенных зависимостей:
MayBe<T> : https://github.com/dobrokot/may_be/blob/master/may_be.hpp

Если кто-то сможет помочь переписать с учетом strict aliasing - буду благодарен. Как с учетом strict aliasing вообще разместить объект типа T в массиве char[sizeof(T)] ? Русские коментарии на английские переведу сам, если вдруг окажется что штука нужная и нравится людям больше чем boost::optional :)

Примеры использования: https://github.com/dobrokot/may_be/blob/master/may_be_usage_example.cpp
Collapse )