Thursday, June 25, 2009

черем суров.
на череме живут кемеровские студенты-медики, пенсионеры и работники кувалды и газового ключа.
кемеровские студенты-медики, съезжая с квартиры и собираясь домой не суетливы, спокойны и источают какую-то особенную уверенность и спокойствие. неспеша выколачивают пыль из хозяйских ковров, грузят скарб в машины, прощаются и уезжают.
вообще конечно не догадался бы, что это студенты, если бы хозяйка не сказала. ну и разговоры конечно выдают: "... а вот если ехать по ленина, за рулем пиздеть по телефону и пить пиво, то сколько проехать получится прежде чем остановят?".

через два дня приезжают обратно, стучатся в ворота: забыли запасные колеса. лысая практически резина, ржавые диски. но все равно - пригодится, мало ли что. помогаю погрузить в салон.
из четырех дверей снаружи открывается только передняя пассажирская.
выключив все световые приборы, у студента наконец получается завести этот древний опель. опель большой, зеленый и похож на полицейский форд из американских фильмов. начинается дождь. я говорю, что не решился бы в кемерово так ехать.
- да ладно! доедем! вот Жека второй год уже так ездит.
у Жеки 24-я волга в таком же примерно состоянии. панель приборов - старинная, еще без тахометра. выглядит, впрочем новее: свежая голубая краска из баллончика.
- а далеко?
- в Гурьево
где Гурьево я не знаю.
я от всего этого вспоминаю москвич, который стоит у меня во дворе. пытаюсь представить как они ночью едут домой и становится очень завидно.
докуриваю сигарету, запираю ворота и иду в дом.

Tuesday, June 2, 2009

выстрелил тут себе в ногу.
у меня есть класс который конвертирует говно в специальное концентрированное говно.

class Compressor{
public:
Compressor();
int work(const char *src,char *dst);
private:
int uber_data;
int settings;
char *govnobuf;
};
Compressor *compressors = new Compressor[CPU_COUNT];

ну и они, экземпляры, там запускаются в разных потоках одновременно.
все работает, никаких вопросов.
и тут пришло время прикрутить второй вид концентратора SuperCompressor2.
полиморфизм и отделение интерфейса от реализации спасут нас, решил я и немедленно сделал так:

class AbstractCompressor
{
public:
virtual int work(const char *src,char *dst) = 0;
};

class Compressor: public AbstractCompressor{ ... };

class SuperCompressor2: public AbstractCompressor
{
public:
SuperCompressor2();
int work(const char *src,char *dst);
private:
int settings2;
char *govnobuf;
char *interimbuf;
};

ага.

AbstractCompressor *compressors;
if(application.settings.what_compressor_to_use)
compressor = new Compressor[CPU_COUNT];
else
compressor = new SuperCompressor2[CPU_COUNT];

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

compressor[i].work(src,dst);

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

(AbstractCompressor *)((char *)compressor + i*sizeof(AbstractCompressor))

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