![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
Этот код взят из atlframe.h
template <class T> class CUpdateUI : public CUpdateUIBase { public: CUpdateUI() { T *pT = static_cast< T * >( this ); pT; ^ ^---- Назначение этой строки разъясните пожалуйста const _AtlUpdateUIMap *pMap = pT->GetUpdateUIMap(); Это сообщение отредактировал(а) Vladimiir - 15.8.2010, 13:38 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
указатель на тип T Добавлено через 4 минуты и 10 секунд нашел этот код:
|
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
T *pT = static_cast< T * >( this ); boostcoder указатель на тип T Это понятно. А какой смысл в строке: pT; Что это то дает? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
В некоторых функциях в WTL используется такой примерно код: void funXX( int iVp1, .... ) { ... ... (iVp1); ^ ^--- то же непонятный для меня смысл строки. Растолкуйте. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
самое вероятное, что это остатки времен разработки..
так например если закомментить группу строчек работающих с мап, то выдаст предупреждение о не использовании pT. выэше указанным способом проблема с предупреждением решена.. |
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
Возможно. Но ведь далее по тексту переменная pT используется.
Да и такого типа строки я встречал не раз в функциях WTL. Конечно я и сам пробывал "крутить" этот код с некоторыми вариациями. Например. Как поведет себя эта функция если pT == NULL. Думал, что или исключения ккие-либо будут ... Но действительно похоже, что такие строки можно закомментировать. Но если бы это был единичный случай ... Не могут эти ребята вот так просто по забывчивости оставить не нужный код. Там профи конечно высокого класса и интересно было бы знать для чего такие строки оставили в коде T *pT = static_cast< T * >( this ); pT; const _AtlUpdateUIMap *pMap = pT->GetUpdateUIMap(); Это сообщение отредактировал(а) Vladimiir - 15.8.2010, 19:23 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Я тоже сперва подумал, что для того, чтобы избавиться от warning-а, написал..потом поискал этот файл и увидел, что pT используется. У меня тоже нет вариантов, никак не могу найти смысла этой строке, она ничего не делает, на результате программы это никак не отразиться, на процессе компиляции тоже. Скорее всего просто забыли убрать.
Ты будешь удивлен, но это не так..индусы повсюду, а MFC и ATL яркое тому доказательство ![]() Это сообщение отредактировал(а) azesmcar - 15.8.2010, 20:24 |
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
Как то мне попалась под руки DVD /приложение к какому-то журналу/. Так там была avi с интервью одного из главных разработчиков MFC. Кто бы вы думали индус. Нет Российский программист ... В Microsoft абы кого не возьмут. Иначе ей там таких чудес натворят ... Да и чем индусы, китайцы, японцы, ... плохи. Парни как парни ... Не удивлюсь даже если генеральным директором Microsoft станiет например вьетнамец. Все это предрассудки. Нет наций у которых люди ущербны в умственных способностях .. Это сообщение отредактировал(а) Vladimiir - 15.8.2010, 20:45 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Vladimiir
Под словом индус уже давно понимают не жителя индии, а человека, практикующего индокод, большинство из них оказались индусами..отсюда и название. А MFC - лучший пример того, как не надо писать программы. Это сообщение отредактировал(а) azesmcar - 15.8.2010, 20:52 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
наверное наши потомки, многие поколения, будут считать это поговоркой ![]() |
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
http://lurkmore.ru/Индусский_код ... Также есть народная примета: если программист поёт и танцует - значит, он написал индусский код А что же тогда пишут те, которые целыми днями сидят в наушниках и слушают всякие бесноватые группы ? |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
... Затрудняюсь ответить, бесноватых групп не слушаю Если продолжить эту тему, то мы коснемся духовных вопросов. И одним из главных вопросов - вероисповедания . Кого интересуют эти вопросы нплохим стартом может быть http://kuraev.ru/forum/ Но не советую на нем долго задерживаться. Там в большинстве люди имеют "свое" мнение ... и во многих случаях там просто флуд, который ни как не может быть полезным для души. Кто действительно хочет получить пользу для души. Тому прямой ход в Православную церковь ... И конечно нужно приобрести святотеческие книги /не обязательно много/. Хотя Православных библиотек в inet много ... |
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
Похоже корни двух необычных программных видах строк, приведенных выше лежат где-то в макросах WTL.
Вот посмотрите на ниже приведенный код макроса из atldef.h #ifndef ATLVERIFY #ifdef _DEBUG #define ATLVERIFY(expr) ATLASSERT(expr) #else #define ATLVERIFY(expr) (expr) #endif // DEBUG #endif // #ifdef _DEBUG ... Но макрос то дает код только после компиляции ... В некотрых функциях WTL сразу после декларации функции следуют строки типа: (parametr1); (parametr2); (parametr3); (parametr4); .... Так вот если бы эти строки были записаны так: ATLVERIFY(parametr1); ATLVERIFY(parametr2); ATLVERIFY(parametr3); ATLVERIFY(parametr4); .... то и вопросов бы не было. Наверное так оно и было, а затем программист почему то решил строки оставить, но ATLVERIFY в них убрал Такое пояснение для самого себя меня вполне удовлетворяет ... Таких вариаций можно напридумывать много ... Еще хотелось бы сказать об http://lurkmore.ru/Индусский_код В этой статье говорится только об одном аспекте индусского кода - программного кода. Но есть еще один очень важный и не затронутый вопрос. Написание читабельного кода. Что-там далеко ходить. Возьмем к примеру atldef.h Пример понимаю не убедительный, но для начала .. // --- Так в atldef.h // #ifdef _ATL_DEBUG_INTERFACES #ifndef _ATL_DEBUG #define _ATL_DEBUG #endif // _ATL_DEBUG #endif // _ATL_DEBUG_INTERFACES // --- Так после редактирования // #ifdef _ATL_DEBUG_INTERFACES #ifndef _ATL_DEBUG #define _ATL_DEBUG #endif #endif Понимаю, что привел не убедительный пример ... Ну посмотрим на типичную запись кода из какого-нибудь проекта sourceforge.net Например: // --- Было // info.rate = srate; info.bitrate = srate * 16 * channels; info.order = __BYTE_ORDER; info.format = raw; info.annotation = "OSS Soundcard"; // ---Стало // info.rate = srate; info.bitrate = srate * 16 * channels; info.order = __BYTE_ORDER; info.format = raw; info.annotation = "OSS Soundcard"; В верхних строках нужно сделать какое-то мысленное усилие, что-бы увидеть значение какой-то переменной. В отредактированных строках /на мой взгляд/ проще. Эта тема очень обширна она касается и записи комментариев ... Когда я беру код какого-то проекта из sourceforge.net и вижу, что он написан вроде бы толково, то первым делом редактирую текст и привожу к читабельному виду. А затем уже по мере необходимости начинаю редактировать код классов. За частую процентов на 30 люди пишут функции под конкретные нужды конкретного кода. Например вместо того, чтобы обеспечить "полный" интерфейс к какому-нибудь API без потери эффективности и читабельности, многие значения заданы константами, хотя параметр может принимать много значений ... В результате вместо одной функции плодится две, три. Зачем ? В чем удобство ? Мне так проще пользоваться API к одной универсальной, а не к трем в которые выполняют какое-то подмножество одной. Для меня субъективно разница в том, что я концентрирую внимание на одной мнемонике, а не трех Конечно написано сумбурно, но было бы не плохо, чтобы в программистских кругах выработался вкус к читабельному коду. Это я ни где не наблюдал. Пишут как "курица лапой". Ну вcе. Уф ... Это сообщение отредактировал(а) Vladimiir - 16.8.2010, 00:11 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
до компиляции, в момент препроцессирования. тут вот что о них пишут:
|
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
ATLASSERT/ATLVERIFY - These are used to make sure a debug build reports a problem with the expression/invariant
ATLENSURE - Debug is the same as ATLVERIFY, retail throws a C++ exception ^--- все верно как 2 * 2 == 0x04 Ну конечно. Сначала макросы разворачиваются, а потом уже идет компиляция. Ну да чтобы заглянуть в код после макроподстановок нужно в опциях проекта выставить определенную опцию. А вот в listing честно говоря не обращал внимания приводится уже код с макроподстановками или "чистый". Я использую Visual Studio и по моему там нет нельзя так выставить опции, чтобы можно было получить и листинг с макроподстановками и объектный код. То способ которым я использую позволяет получить листинг с макроподстановками. Но продолжить отладку я не могу. Нужно поменять а проекте опцию "на обычный" код. Да и вообще такая потребность у меня возникает крайне редко. Зачем так далеко ходить. Вот WTL: http://sourceforge.net/projects/wtl/ Вот нашел ... inline int vsprintf_x( LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args ) { #if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); #else cchBuff; // Avoid unused argument warning Это сообщение отредактировал(а) Vladimiir - 16.8.2010, 23:07 |
|||
|
||||
Vladimiir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.7.2010 Репутация: нет Всего: нет |
Вот что ответил мне Bjarke Viksoe. Hi, In older versions of the Microsoft C++ compiler, it would emit a warning "Member pT declared but never used" -- even if the pT member is clearly used in the code. This dummy assignment removes that compiler warning. In your example with iVp1, the member does not seem to be used anywhere and the compiler also emits the same compiler warning when you compile with Level 4 Warning Level. Again, the dummy assignment removes the compiler warning. regards bjarke |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Не знаю зачем такой код могут писать профессионалы, знаю что такой код получается (не специально) писать у меня. Причина лежит в том что мало опыта, а практики еще меньше, поэтому когда пишется та или иная функция она пишется приблизительно под ограниченное количество задач которые на данном этапе очевидны. Но как правило спустя некоторое время находится еще какая нибудь задача которая похожа, но о которой я еще даже не думал, и стоит два варианта: 1) Переделать функцию как более обобщенную и все места ее вызова 2) написать ниже новую похожую. Проблема по которой в больших случаях пока предпочтение уходит 2-му варианту заключается в том что, если обобщить старую функцию нужно переосмыслить всю логику, и учесть все новые нюансы совместив их со старыми, что как правило приводит к ошибкам логики (по неопытности). А потом возможно появиться необходимость обобщить ее еще раз... неявные ошибки неизбежны. Сложно когда нет опыта построения проектов. Когда удается в самом начале разложить все по полочкам и предусмотреть хотя бы всю высшую абстракцию. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
значит все таки для ворнингов )) ![]() |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Просто жесть. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |