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[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[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[9]: Happy debugging!
От: Axc  
Дата: 21.09.07 11:16
Оценка: 3 (1) +1
drx>Здравствуйте, Axc, Вы писали:

drx>Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?


Всего лишь стиль.
Строка "T* const result = q == p ? p : q;" эквивалентна гораздо более простой строке "T* const result = q;" Но для работы кода это не существенно.
Re[4]: Неохота...
От: anonim_44ax  
Дата: 21.09.07 06:21
Оценка: :)
I>>>Если охото напакастить, то можно гораздо более изощерено придумать.
_>>Ну так придумайте.

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

Значицца понты кидаем, батенька.
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]: UPD: чуть более злостный вариант
От: frogkiller Россия  
Дата: 21.09.07 12:58
Оценка: :)
Здравствуйте, drx, Вы писали:

drx>Проблема приведённого мной варианта в том, что дебаггер вполне может зайти в темплейт, и тогда правда быстро вылезет наружу.

drx>Приведённый ниже вариант лишён этого недостатка:
drx>
drx>#define this (this && __LINE__ % 10 == 1 ? this + 1 : this)
drx>


drx>P.S.: Всё-таки утром лучше думается


это мне напоминает старый баян:
#define true (rand() % 123)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[12]: Happy debugging!
От: drx США  
Дата: 21.09.07 19:41
Оценка: :)
Андрей, наверное, я был не одинок в своём ходе мыслей, т.к. минусы на твой пост про бессмысленность условного выражения до сих пор продолжают ставить
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: 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!
От: 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: 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>...


Либо мне непонятна твоя логика, либо я не понял, с чем в исходном посте ты не согласен.
Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?
Re: Happy debugging!
От: goto Россия  
Дата: 21.09.07 11:20
Оценка:
Здравствуйте, drx, Вы писали:

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[10]: Happy debugging!
От: drx США  
Дата: 21.09.07 12:00
Оценка:
Здравствуйте, Axc, Вы писали:

drx>>Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?

Axc>Всего лишь стиль.
Axc>Строка "T* const result = q == p ? p : q;" эквивалентна гораздо более простой строке "T* const result = q;" Но для работы кода это не существенно.

Это не стиль — нафиг такие стили, это я протупил, извини. И упорно не хотел понимать, в чём дело. Позор мне!

Код, который я запостил, сначала был немного более сложным. Но перед тем, как отослать его на rsdn я немного сократил его, решив, что и так будет неплохо. В коде, который я не запостил, это условие имело смысл. После рефакторинга оно превратилось в "q == p ? p : q", а я не распознал, что оно теперь эквивалентно "q", т.к. дальше продолжал думать о нем как об условном выражении.

Надо будет приучить свои глаза при рефакторинге замечать шаблон "q == p ? p : q", чтобы преобразовывать его в "q".

Спасибо, что у тебя хватило терпения объяснить мне ошибку
Re[11]: Happy debugging!
От: Axc  
Дата: 21.09.07 12:17
Оценка:
Здравствуйте, drx, Вы писали:

drx>Это не стиль — нафиг такие стили


Для такой мерзопакости могло быть и стилем
Re[3]: Happy debugging!
От: alexqc Россия
Дата: 21.09.07 12:37
Оценка:
Здравствуйте, drx, Вы писали:

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


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

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

drx>Нет.

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


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


Хорошо, перепишем:


T* const result;
if(q==p) result=p;
else result=q;




drx>Ну или просто попробуй скомпилировать и запустить

drx>
drx>int i = 0 == 1 ? 2 : 3;
drx>std::cout << i;
drx>


Обманываете, батенька!
Если быть до конца честным, должно быть:

//считаем что p=2

//случай q=2
int i = 2 == 2 ? 2 : 2;
std::cout << i;

//случай q=3
int j = 3==2? 2 : 3;
std::cout << j;


В обоих случаях выведет "значение q" (2 когда q=p=2, 3 когда q=3).
И зачем огород городить?
Живи, Україно, прекрасна і сильна
Re: Happy debugging!
От: Kore Sar  
Дата: 21.09.07 12:41
Оценка:
Еле догнал. Но смешно. Спасибо за позитифф.
Re[5]: ????????????
От: VMin Россия  
Дата: 21.09.07 14:31
Оценка:
Здравствуйте, anonim_44ax, Вы писали:

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

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

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

_>Значицца понты кидаем, батенька.


Я понимаю русский и английский.
По фене не ботаю.














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

По-моему Математика — это Слово Божие. (22.03.05)
Re[4]: Happy debugging!
От: drx США  
Дата: 21.09.07 18:25
Оценка:
Здравствуйте, alexqc, Вы писали:

A>...

Извини, что снова отвечаю ссылкой, но я уже ответил на это немногим ранее здесь
Автор: drx
Дата: 21.09.07
.
Re[3]: UPD: чуть более злостный вариант
От: drx США  
Дата: 21.09.07 18:50
Оценка:
Здравствуйте, frogkiller, Вы писали:

F> это мне напоминает старый баян:

F>#define true (rand() % 123)

Да, тоже весёло

Кстати, в голову пришёл вариант, противоположный твоему:
#define rand() (rand(), 4)


(Навеяно вот этим
Автор: Jax
Дата: 22.08.07
)
Re[2]: Happy debugging!
От: drx США  
Дата: 21.09.07 19:14
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>забавно, но это помоему быстро обнаруживаемый жучок,

S>а вот скажем такой
S>
S>T* B6085443BCE84d0489BD76C74663E951( T* p )
S>{
S>static T* q = p;
S>return q;
S>}
S>#define this B6085443BCE84d0489BD76C74663E951( this )
S>

S>имел бы шансы дожить до заказчика

IMHO, всё зависит от контекста — в насколько "глобальный" хидер ты его запихнёшь и вообще, как повезёт. Например, при вставке исходного варианта в precompiled header проекта до всех инклудов, моя прога не смогла даже стартануть — сразу вылетела. Вставил после инклудов и наблюдал забавный эффект: до поры до времени всё работает нормально, но как только на экране появляются pop-up меню, которые, в свою очередь, создаются с помощью visitor'ов, возникает ощущение, что у тебя плавно едет крыша — всё перепутано (следствие надругательства над строками вида visitor.accept( *this )).
Вобщем, всё равно придётся поработать над подбором хорошего места или подходящего класса (воспользоваться перегрузкой) в конкретном проекте.
Re: Happy debugging!
От: Eugeny__ Украина  
Дата: 30.09.07 20:03
Оценка:
Здравствуйте, drx, Вы писали:

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>


Гораздо пакостнее было бы возвращать предыдущую ссылку не всегда, а, скажем, с вероятностью 1%. Но это жестоко.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.