суббота, 16 мая 2009 г.

Вызов чисто виртуальной функции))

Ничто так не ограничивает полёт мысли программиста, как компилятор :)) Но как сказал один мой товарищ - если иметь фантазию - можно творить чудеса... Сегодня мне в аську колега в комманде кинул интересный код вызова чисто виртуальной фукнции:

void func(class A*);

class A
{
public:
A() {func(this);}
virtual void pure() = 0;
};

class B : public A
{
public:
virtual void pure() {}
};

void func(A* a)
{
a->pure();
}

int main()
{
B* b = new B();
}

понедельник, 6 апреля 2009 г.

Думал, что мир перевернулся...

Сидел на лекции, баловался.. В итоге вышло, что заработал данный кусок кода (но только в релиз варианте, дебаг перехватывает обращения к неициализированному поинтеру):

class A {
public:
int a;
bool b;
float c;
void debug() { printf("%i %s %f\r\n", a, b ? "true" : "false", c); }
};

int main() {
A * f; // <-- ??? f->a = 4;
f->b = true;
f->c = 4.5f;
f->debug();
return 0;
}

Дальше в лес, больше дров, мой товарищ решил совсем извратиться :))

float* f;
int i;
for (i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Так работает, но после определенного числа итераций валится.

А след. кусок валится сразу (если int i обьявить в конструкции for).
float* f;
for (int i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}

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

четверг, 5 марта 2009 г.

Кхм... Раз два раз два... Проверка микрофона.. Я в эфире?))

Hello world.
Вот и у меня любопытство взяло верх, решил поближе познакомиться с ЖЖ )) Посмотрим, что из этого выйдет ;)