*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

пятница, 29 октября 2010 г.

Ссылка на временный объект в списке инициализации конструктора

Имеем два исходника:

#include <iostream>

struct A {
  A();
  const int& i;
};

A::A() : i(123) {}

int main() {
  A a;
  std::cout << a.i << std::endl;
}
и

#include <iostream>

struct A {
  A() : i(123) {}
  const int& i;
};

int main() {
  A a;
  std::cout << a.i << std::endl;
}

Будучи скомпилированными компилятором от Sun или GCC, эти два примера печатают разные результаты. И первый - неправильный. Студия же 2010, с настройками по умолчанию, дает предупреждение и генерирует код, работающий правильно (точнее, как ожидает программист) в обоих случаях.

Понятно, что код сам по себе несколько странный, так как сложно представить себе, кому может понадобиться инициализировать ссылку константой, которая передается в конструктор не извне, а создается временно во время обработки списка инициализации. Но вот на ошибку-опечатку вполне себе потянет.

Ко мне пример попал как результат анализа реального бага.

вторник, 26 октября 2010 г.

Никому нельзя верить, даже себе

Есть (точнее был) у меня вот такой код:

const std::string& id() const { return id_; }
std::string id() { return id_; }

В нем есть одна досадная опечатка, из которой код:

order.id() = 123;

делал то, что от него не ожидалось, а точнее, ничего не делал. И проблема, как вы наверное уже догадались, в пропущеном значке "&" во второй строке. Должно было быть так:

const std::string& id() const { return id_; }
std::string& id() { return id_; }

Эта опечатка стоила мне часа поиска проблемы через вторичные признаки в виде иногда не обновляемой базы данных.

Причина? А все потому, что я поленился написать тесты изначально, решив, что это уж очень простые методы. Но теперь таки добавил для этого тест:

TEST(Order, GetterSetters) {
  Order order;
  ...
  EXPECT_EQ(0, order.id());   // Must be initialized.
  order.id() = 123;
  EXPECT_EQ(123, order.id());
  ...
}

Решил сэкономить время, а вышло наоборот.

Вывод: тесты, тесты и тесты.

среда, 20 октября 2010 г.

Умножение вручную на бумажке по-китайски

Не берусь утверждать, что этот способ эффективнее традиционного столбика, но все равно впечатляет.

четверг, 7 октября 2010 г.

Книги по обработке строке и производящим функциям

Покупка книг на Амазоне в Европе и Штатах дело крайне простое, удобное и быстрое (особенно для электронных книг). Тут также можно и продавать свои книги. Очень удобно и для владельца, когда надо избавиться от одноразовой книги, и для покупателя, так как можно купить реально дешевле (а потом тоже продать).

Надеюсь, почта России одумается и сделает нормальный сервис доставки.

В Лондоне мой любимый книжный - это Foyles на Charing Cross. Ни в Waterstones, ни в Borders не видел столь огромного отдела технической литературы, которая еще и великолепно отсортирована и разобрана по разделам. Например, отдельный шкаф с книгами чисто по компиляторам, или чисто по языку Хаскель, или по QA тестированию, а вдоль стендов про Java или C++ вообще можно ехать на самокате.

Вобщем, Амазон амазоном, но здорово неспешно зависнуть в таком магазине пару часиков, полистать, пошуршать, пощупать, подумать. Хотя потом можно выписать нужное на бумажку и купить онлайн, ибо дешевле, или скачать.

Куда я первым делом отправился во время визита в Москву на прошлой неделе? В "Библио-Глобус" на Лубянке. Кто знает в Москве офлайновый магазин с большим выбором и лучшей организацией стендов - поделитесь.

Приятно отменить, что очень много переводных книг, причем весьма свежих.

Но еще более приятно, что наша литература ничем не хуже.

В разделе компьютерном купил:

С. М. Окулов, Алгоритмы обработки строк



Как написано в предисловии - это книга посвящена одному вопросу - как искать подстроку в строке за линейное время. На первых страницах рассматривается Кнут-Моррис-Пратт, а дальше начинается всякая жесть. Забавно, что книга из серии "Развитие интеллекта школьников", то есть для просто школьников.

Просто отличная форма изложения: с картинками, диаграммами, пояснениями и примерами. Одна грамотная иллюстрация бывает лучше тысячи слов. Я видел несколько книг Окулова - могу только обоими руками поддержать этого автора. Писать для школьников о сложных алгоритмах - это трудно. А делать еще и понятным языком - особенно.

Вывод: иметь.

Далее, в соседнем разделе математики купил:

С. К. Ландо, Лекции о производящих функциях



Тут прямо на первых страницах этой методички понятнейшим образом объясняется, что такое производящие функции и их применение для решения комбинаторных задач, причем для понимания даже не обязательно вспоминать Анализ. Разбираются классические задачи про правильные скобочные последовательности, числа Каталана, язык Дика и многие другие. Местами там, конечно, жестковато с точки зрения математики, но вводные даются просто великолепно.

Эта книга есть в свободном варианте.

Ну и чтобы два раза не вставать, под занавес две ссылки на грамотные
подборки электронных книг.

http://www.mccme.ru/free-books/
http://e-maxx.ru/bookz/

P.S. Кто знает еще хорошие ссылки по электронным книгам - делитесь в комментах.