Happy debugging!
От: drx США  
Дата: 20.09.07 20:32
Оценка: 9 (3) :))) :))) :))) :))
Здравствуйте!

Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант:
// Put this to some secluded nook
template< typename T >
T* B6085443BCE84d0489BD76C74663E951( T* p )
{
    static T* q = p;
    T* const result = q == p ? p : q;
    q = p;
    return result;
}

#define this B6085443BCE84d0489BD76C74663E951( this )
// Happy debugging!
Re: Happy debugging!
От: ixbt78  
Дата: 20.09.07 21:13
Оценка:
Так в чем прикол?
Если охото напакастить, то можно гораздо более изощерено придумать.
Re[2]: Happy debugging!
От: anonim_44ax  
Дата: 20.09.07 21:19
Оценка:
I>Так в чем прикол?
Это понять только С++ программерам.

I>Если охото напакастить, то можно гораздо более изощерено придумать.

Ну так придумайте.
Re[3]: Неохота...
От: VMin Россия  
Дата: 20.09.07 21:37
Оценка:
Здравствуйте, anonim_44ax, Вы писали:

I>>Так в чем прикол?

_>Это понять только С++ программерам.

I>>Если охото напакастить, то можно гораздо более изощерено придумать.

_>Ну так придумайте.

Так ведь сказал же уже "Неохота..."

Пакости — детское занятие. Ну и пакостников тоже, конечно.

...Не царское это дело.












.
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re: Happy debugging!
От: Axc  
Дата: 20.09.07 22:02
Оценка:
Здравствуйте, drx, Вы писали:

drx> T* const result = q == p ? p : q;


Я чего-то не того. result = q?
Re: Happy debugging!
От: e-Xecutor Россия  
Дата: 21.09.07 05:41
Оценка:
Здравствуйте, drx, Вы писали:

drx>

drx>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>


Warning: Redefined keyword this

не прокатит
Re[4]: Неохота...
От: anonim_44ax  
Дата: 21.09.07 06:21
Оценка: :)
I>>>Если охото напакастить, то можно гораздо более изощерено придумать.
_>>Ну так придумайте.

VM>Так ведь сказал же уже "Неохота..."

Значицца понты кидаем, батенька.
Re: Happy debugging!
От: Max404.NET Россия http://HrExpress.ru/
Дата: 21.09.07 07:10
Оценка:
Здравствуйте, drx, Вы писали:

drx>Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант:

drx>
drx>// Put this to some secluded nook
drx>template< typename T >
drx>T* B6085443BCE84d0489BD76C74663E951( T* p )
drx>{
drx>    static T* q = p;
drx>    T* const result = q == p ? p : q;
drx>    q = p;
drx>    return result;
drx>}

drx>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>// Happy debugging!
drx>


Ничего не понятно, объясните плз...
Одинаковые ошибки необязательно делать каждый раз, достаточно сделать одну, а затем обращаться к ней по мере необходимости из любого места программы.
Re[2]: Happy debugging!
От: alexqc Россия
Дата: 21.09.07 07:41
Оценка: +1
Здравствуйте, Max404.NET, Вы писали:

MN>Здравствуйте, drx, Вы писали:


drx>>Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант:

drx>>
drx>>// Put this to some secluded nook
drx>>template< typename T >
drx>>T* B6085443BCE84d0489BD76C74663E951( T* p )
drx>>{
drx>>    static T* q = p;
drx>>    T* const result = q == p ? p : q;
drx>>    q = p;
drx>>    return result;
drx>>}

drx>>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>>// Happy debugging!
drx>>


MN>Ничего не понятно, объясните плз...


Каждое обращение по this на самом деле вызовет обращение по "предыдущему" this.

Мне только не понятна фраза
T* const result = q == p ? p : q;

Разве это не эквивалент просто
T* const result = q;
Живи, Україно, прекрасна і сильна
Re[2]: Happy debugging!
От: drx США  
Дата: 21.09.07 08:54
Оценка: :)))
Здравствуйте, Axc, Вы писали:

drx>> T* const result = q == p ? p : q;

Axc>Я чего-то не того. result = q?

Нет.
Это выражение компилится так, как будто бы оно выглядело следующим образом:
T* const result = ((q == p) ? p : q);


RTFM, вобщем. Боюсь, что придётся копаться в грамматике языка, т.к. AFAIR Страсутруп в своей книге не стал объяснять подобный случай, а сразу отослал к грамматике.

Ну или просто попробуй скомпилировать и запустить
int i = 0 == 1 ? 2 : 3;
std::cout << i;
Re[2]: Happy debugging!
От: drx США  
Дата: 21.09.07 08:56
Оценка:
Здравствуйте, e-Xecutor, Вы писали:

drx>>#define this B6085443BCE84d0489BD76C74663E951( this )

EX>Warning: Redefined keyword this
EX>не прокатит

А что за компилятор? Наверное, какой-нибудь не-mainstream'овый вроде CodeWarrior?
MSVC 7.1, MSVC 8.0, GCC 3.4.5, Comeau Online 4.3.9 ALPHA компилят это без warning'ов.
IMHO, правильно делает твой компилятор, что проверяет ключевые слова на предмет macro redefinition
Re[3]: Happy debugging!
От: drx США  
Дата: 21.09.07 08:59
Оценка:
Здравствуйте, alexqc, Вы писали:

A>Мне только не понятна фраза

A>T* const result = q == p ? p : q;
A>Разве это не эквивалент просто
A>T* const result = q;

Уже ответил здесь
Автор: drx
Дата: 21.09.07
Re: UPD: чуть более злостный вариант
От: drx США  
Дата: 21.09.07 09:02
Оценка:
Проблема приведённого мной варианта в том, что дебаггер вполне может зайти в темплейт, и тогда правда быстро вылезет наружу.
Приведённый ниже вариант лишён этого недостатка:
#define this (this && __LINE__ % 10 == 1 ? this + 1 : this)


P.S.: Всё-таки утром лучше думается
Re[3]: Happy debugging!
От: Axc  
Дата: 21.09.07 09:03
Оценка: 3 (1) +2 -2 :))
Здравствуйте, drx, Вы писали:


drx>>> T* const result = q == p ? p : q;

Axc>>Я чего-то не того. result = q?

drx>Нет.

drx>Это выражение компилится так, как будто бы оно выглядело следующим образом:
drx>
drx>T* const result = ((q == p) ? p : q);
drx>


Зря я убрал из своей подписи сертификат...

Следите за руками: если q != p, то выбираем q. Если q == p, то выбираем p, которое равно q.
Re: Happy debugging!
От: Sni4ok  
Дата: 21.09.07 09:10
Оценка:
Здравствуйте, drx

забавно, но это помоему быстро обнаруживаемый жучок,
а вот скажем такой
T* B6085443BCE84d0489BD76C74663E951( T* p )
{
static T* q = p;
return q;
}
#define this B6085443BCE84d0489BD76C74663E951( this )

имел бы шансы дожить до заказчика
Re[4]: Happy debugging!
От: drx США  
Дата: 21.09.07 09:19
Оценка:
Здравствуйте, Axc, Вы писали:

Axc>Следите за руками: если q != p, то выбираем q. Если q == p, то выбираем p, которое равно q.


Кручу-верчу, обмануть хочу
А если запустить несколько раз с разными значениями p?
B6085443BCE84d0489BD76C74663E951( a ) // вернёт a
B6085443BCE84d0489BD76C74663E951( a ) // вернёт a
B6085443BCE84d0489BD76C74663E951( b ) // вернёт a
B6085443BCE84d0489BD76C74663E951( b ) // вернёт b
B6085443BCE84d0489BD76C74663E951( a ) // вернёт b
B6085443BCE84d0489BD76C74663E951( c ) // вернёт a

Под каким напёрстком шарик?
Re[5]: Happy debugging!
От: Axc  
Дата: 21.09.07 09:46
Оценка:
Здравствуйте, drx, Вы писали:


drx>А если запустить несколько раз с разными значениями p?


Я ж не говорю, что код вообще не работает. Я говорю о конкретной строке.
Re[6]: Happy debugging!
От: drx США  
Дата: 21.09.07 09:59
Оценка:
Здравствуйте, Axc, Вы писали:

Axc>Я ж не говорю, что код вообще не работает. Я говорю о конкретной строке.


Хорошо, постараюсь объяснить другими словами.
Ты, наверное, не обратил внимание на static в объявлении q.

Axc>если q != p, то выбираем q. Если q == p, то выбираем p, которое равно q.

p эквивалентно q только при первом вызове функции. Все последующие вызовы q имеет значение "предыдущего" p.
Re[7]: Happy debugging!
От: Axc  
Дата: 21.09.07 10:06
Оценка:
Здравствуйте, drx, Вы писали:

drx>p эквивалентно q только при первом вызове функции. Все последующие вызовы q имеет значение "предыдущего" p.


Месье!
Забыли про все функции.

int a, b;
....

int res = a == b ? b : a;
assert(res == a);
Re[8]: Happy debugging!
От: drx США  
Дата: 21.09.07 10:22
Оценка:
Здравствуйте, Axc, Вы писали:

Axc>...


Либо мне непонятна твоя логика, либо я не понял, с чем в исходном посте ты не согласен.
Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.