воскресенье, 15 мая 2011 г.

Битовый итератор

Новый вариант подсчёта числа установленных битов в файле: http://codepad.org/Bpm179Gv
Да, это битовый итератор))
Читать дальше

суббота, 19 марта 2011 г.

Oтладка сердца

Далее написаны мысли о том из чего у меня складывается, программирование.

Для начала я придумываю цель, то - что за приложение должно быть в конце. Обдумываю, как бы всё замечательно работало. В уме обсасываю каждый поворот меню и нюанс работы программы. Ведь всё будет такое удобное и классное, что самому будет приятно с этим работать. А главное что программа будет очень нужная. Её смогут сразу без подготовки использовать все вокруг, начиная от меня самого и заканчивая моей бабушкой. На этом этапе неплохо бы сделать зарисовки графического интерфейса.
На следующем этапе, я придумываю как приложение будет реализовано на определённом языке программирования и с использованием каких технологий и API. В голове формируются независимые кусочки подпрограммы, которые можно реализовать отдельно от остальных. Ведь всегда проще реализовать несвязные части и потом их сцепить, чем кодить огромного монстра. Все части я так и не могу вычленить на данном этапе и ограничиваюсь лишь первыми и самыми необходимыми. Это скорее всего не графика а само сердце программы - то что в ней работает.
Теперь можно переходить к фазе кодирования. Я кодирую те небольшие кусочки и отлаживаю их. В идеале к каждому кусочку пишу тесты. Некоторые кусочки отлаживаются очень долго. Парочка кусочков превращаются в довольно сложный и запутанный кусок кода. В этом случае необходимо вернуться на предыдущий шаг и перепланировать эту часть программы: разбить на более мелкие кусочки или иным способом преодолеть нарастающую сложность кода. После недолгой отладки я получаю стучащее сердце. Проверяю все необходимые характеристики: частоту стука, громкость удара, частотную составляющую и т.д.
После того как сердце программы уверенно застучало, можно начинать обвес всякими штучками. Прилепить графику, облагородить конфигурационные файлы, учесть параметры запуска из командной строки. Иными словами сделать программу доступной для работы не только программистам, но и домохозяйкам. На этом этапе глобальных проблем не предвидится, ведь сердце программы уже стучит. Код который обеспечивает корректную работу сердца не должен меняться на этом этапе.

Вот теперь программа готова. Осталось её отшлифовать и браться за следующую . . .

Читать дальше

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

Try to f(f(n)) == -n

Увидел недавно интересный вопрос.
Написать такую функцию f, что: f(f(n)) == -n

У кого какие идеи?

Вот самый простой вариант на мой взгляд (правда это не совсем функция):
#define f(n) 0-n
Ну а вот посложнее (правда тут получается 2 функции с одним именем):

template<typename T>
struct param
{
   T n;
   param(T t) : n(t) {}
};

template<typename T>
param<T> f(T n)
{
   T a = (1&(n^(n>>1)));
   n ^= (a ? 0xAA : 0x55);
   return param<T>(n);
}

template<typename T>
T f(param<T> n)
{
   return f(n.n).n + 1;
}

(ссылка - http://codepad.org/TK0GhhAe)

Этот код пока работает только для char.
Так было намного быстрее прогонять полный тест))
Нетрудно модифицировать его для остальных типов.


Читать дальше

Printf структуры?

Угадайте с трёх раз, что выведет следующий код, скомпилированный VS2008?

struct A
{
   int a;
   int b;
   int c;
};

A a = { 10, 20, 30 };

printf("%d %d %d\n", a);


Да, именно то самое: "10 20 30".
И вообще нет никакой проверки типов,
а следовательно и неявного кастования.
Кто, что думает по этому поводу?

Вот что думают на StackOverflow: http://stackoverflow.com/questions/4081491

Читать дальше

воскресенье, 24 октября 2010 г.

Создал новый проект на Google Code - boolib

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

Для начала создал инструмент synchronize(id) для синхронизации потоков в стиле Java. В защищённый блок с одним идентификатором одновременно сможет попасть лишь один поток. Использовать так:


// ...

synchronize(153)
{
   // защищённый код
}

// ...


Сегодня узнал, что POSIX Threads под Windows нужно скачивать ОТДЕЛЬНО!
Почему его нет в Visual Studio по-умолчанию? Это же POSIX!
В общем, synchronize(id) работает только под Windows (использует Mutex-ы).

Читать дальше

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

6 последовательных проблем программиста

6 последовательных проблем программиста:
1) Как бы написать, чтобы скомпилировалось?
2) Как бы написать, чтобы работало как задумано?
3) Как бы написать, чтобы работало быстрее?
4) Как бы быстрее написать?
5) Как бы написать, чтобы было красиво?
6) Как бы написать, чтобы было гибко и повторно-используемо?

Читать дальше

пятница, 20 августа 2010 г.

Исповедь нулевого указателя (Apology of the NULL pointer)

Перевод статьи Apology of the NULL pointer.

"Никто не любит меня. Меня презирали везде, где я побывал. Меня обвиняют в большинстве проблем, а иногда даже в некоторых катастрофах. Некоторые говорят, что я проклят. Некоторые утверждают, что я какая-то болезнь, которую необходимо вылечить. Когда люди видят меня, первая их мысль: "О нет, только не это ...". Ни у кого не найдется доброго слова для меня. Люди готовы тратить часы за часами, чтобы убедиться в том, что меня нет поблизости. Они проводят невероятно много времени выискивая пути, для обхода меня, чтобы раздавить меня, и убедиться в том, что я не могу даже приблизиться к ним. Дальше только хуже, некоторым людям удалось сделать меня невидимым для своих глаз, так что даже если я появляюсь они не видят меня. Если мне удастся приблизиться и сказать "привет", люди не отвечают "привет" мне. Когда я что-либо говорю, люди смотрят на меня с отвращением. Люди издавна считают, что я самое худшее, что может случиться с их программным обеспечением.
Они просто не понимают меня. На самом деле я думаю, что меня вообще НИКТО не понимает. Но это нормально, потому что не важно буду ли я рядом, когда вы выпускаете ваше программное обеспечение. Я все равно буду рядом, когда ваше программное обеспечение устареет. В действительности, вы можете рассчитывать на то что я рядом всё время. И все же я не преследую вас. Если вы только остановитесь на некоторое время и выслушаете мои слова, вы увидите, что я могу стать вашим лучшим другом. Моя задача очень проста: если я появляюсь в вашем программном обеспечении, это не является признаком того, что ваше программное обеспечение плохо спланировано, я лишь указываю на аспекты не рассмотренные ранее. Если бы вы только поняли, что иногда лучше, чтобы я пришел и сказал вам "привет", чем вы бы хлопнули дверью перед моим лицом. Вы бы поняли, что мы можем работать вместе, чтобы сделать ваше программное обеспечение лучшим когда-либо существовавшим программным обеспечением. Так что, пожалуйста, прекратите проклинать меня и на этот раз постарайтесь прислушаться к моему посланию."

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

Оригинал статьи.
Читать дальше