Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Для чего использует такой код 
V
    Опции темы
Vladimiir
Дата 15.8.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
boostcoder
Дата 15.8.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Vladimiir @  15.8.2010,  13:23 Найти цитируемый пост)
Назначение этой строки разъясните пожалуйста

указатель на тип T

Добавлено через 4 минуты и 10 секунд
нашел этот код:
Код

template <class T>
class CUpdateUI : public CUpdateUIBase
{
public:
    CUpdateUI()
    {
        T* pT = static_cast<T*>(this);
//        pT; // можно просто закоментить.
        const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap();
        m_pUIMap = pMap;
        ATLASSERT(m_pUIMap != NULL);
        int nCount;
        for(nCount = 1; pMap->m_nID != (WORD)-1; nCount++)
            pMap++;


PM WWW   Вверх
Vladimiir
Дата 15.8.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.7.2010

Репутация: нет
Всего: нет




 T  *pT = static_cast< T * >( this );

boostcoder  указатель на тип T

 Это понятно. А какой смысл в строке:
  pT;

 Что это то дает?
 
PM MAIL   Вверх
boostcoder
Дата 15.8.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Vladimiir @  15.8.2010,  13:59 Найти цитируемый пост)
Что это то дает?

честно говоря - хз smile 
PM WWW   Вверх
Vladimiir
Дата 15.8.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.7.2010

Репутация: нет
Всего: нет




 В некоторых функциях в WTL используется такой примерно код:

 void  funXX( int iVp1, .... ) {

 ...
 ...
 
 (iVp1);

 ^
 ^---  то же непонятный для меня смысл строки. 
         Растолкуйте.



 
PM MAIL   Вверх
mes
Дата 15.8.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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



--------------------
PM MAIL WWW   Вверх
Vladimiir
Дата 15.8.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
mes
Дата 15.8.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Vladimiir @  15.8.2010,  18:20 Найти цитируемый пост)
Не могут эти ребята вот так просто по забывчивости оставить не нужный код.

а если представить, что не по забывчивости..

 smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.8.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Vladimiir @  15.8.2010,  19:20 Найти цитируемый пост)
  Не могут эти ребята вот так просто по забывчивости оставить не нужный код.
  Там профи конечно высокого класса и интересно было бы знать для чего такие строки оставили в коде

Я тоже сперва подумал, что для того, чтобы избавиться от warning-а, написал..потом поискал этот файл и увидел, что pT используется. 
У меня тоже нет вариантов, никак не могу найти смысла этой строке, она ничего не делает, на результате программы это никак не отразиться, на процессе компиляции тоже. Скорее всего просто забыли убрать.

Цитата(Vladimiir @  15.8.2010,  19:20 Найти цитируемый пост)
  Там профи конечно высокого класса и интересно было бы знать для чего такие строки оставили в коде

Ты будешь удивлен, но это не так..индусы повсюду, а MFC и ATL яркое тому доказательство smile 

Это сообщение отредактировал(а) azesmcar - 15.8.2010, 20:24
PM   Вверх
Vladimiir
Дата 15.8.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.7.2010

Репутация: нет
Всего: нет




  Как то мне попалась под руки DVD /приложение к какому-то журналу/. Так там была avi с интервью одного из главных разработчиков
  MFC. Кто бы вы думали индус. Нет Российский программист ... В Microsoft абы кого не возьмут. Иначе ей там таких  чудес натворят ...
  Да и чем индусы, китайцы, японцы,  ... плохи. Парни как парни ... Не удивлюсь даже если генеральным директором Microsoft станiет
  например вьетнамец. Все это предрассудки. Нет наций у которых люди ущербны в умственных способностях ..

Это сообщение отредактировал(а) Vladimiir - 15.8.2010, 20:45
PM MAIL   Вверх
azesmcar
Дата 15.8.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Vladimiir

Под словом индус уже давно понимают не жителя индии, а человека, практикующего индокод, большинство из них оказались индусами..отсюда и название. А MFC - лучший пример того, как не надо писать программы.

Это сообщение отредактировал(а) azesmcar - 15.8.2010, 20:52
PM   Вверх
boostcoder
Дата 15.8.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(azesmcar @  15.8.2010,  20:51 Найти цитируемый пост)
MFC - лучший пример того, как не надо писать программы.

наверное наши потомки, многие поколения, будут считать это поговоркой smile 
PM WWW   Вверх
Vladimiir
Дата 15.8.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.7.2010

Репутация: нет
Всего: нет




   http://lurkmore.ru/Индусский_код

 ... Также есть народная примета: если программист поёт и танцует - значит, он написал индусский код

  А что же тогда пишут те, которые целыми днями сидят в наушниках и слушают всякие  бесноватые группы ?
PM MAIL   Вверх
azesmcar
Дата 15.8.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Vladimiir @  15.8.2010,  21:10 Найти цитируемый пост)
  А что же тогда пишут те, которые целыми днями сидят в наушниках и слушают всякие  бесноватые группы ? 

Затрудняюсь ответить, бесноватых групп не слушаю smile 
PM   Вверх
Vladimiir
Дата 15.8.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.7.2010

Репутация: нет
Всего: нет




 ... Затрудняюсь ответить, бесноватых групп не слушаю

  Если продолжить эту тему, то мы коснемся духовных вопросов. И одним из главных вопросов -  вероисповедания .
  Кого интересуют эти вопросы нплохим стартом может быть http://kuraev.ru/forum/
  Но не советую на нем долго задерживаться. Там в большинстве люди имеют "свое" мнение ... 
  и во многих случаях там просто флуд, который ни как не может быть полезным для души.
  Кто действительно хочет получить пользу для души. Тому прямой ход в Православную церковь ...
  И конечно нужно приобрести святотеческие книги /не обязательно много/. Хотя Православных библиотек в inet много ...
 
PM MAIL   Вверх
Vladimiir
Дата 15.8.2010, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
boostcoder
Дата 15.8.2010, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Vladimiir @  15.8.2010,  22:51 Найти цитируемый пост)
Но макрос то дает код только после компиляции

до компиляции, в момент препроцессирования.
тут вот что о них пишут:
Цитата

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

PM WWW   Вверх
Vladimiir
Дата 16.8.2010, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Vladimiir
Дата 17.8.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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

PM MAIL   Вверх
cupper
Дата 18.8.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата

Например вместо того, чтобы обеспечить
 "полный" интерфейс к какому-нибудь API без потери эффективности и читабельности, многие значения заданы константами, хотя
 параметр может принимать много значений ... В результате вместо одной функции плодится две, три. 
 Зачем ? В чем удобство ? Мне так проще пользоваться API к одной универсальной, а не к трем в которые выполняют какое-то
 подмножество одной.

Не знаю зачем такой код могут писать профессионалы, знаю что такой код получается (не специально) писать у меня. Причина лежит в том что мало опыта, а практики еще меньше, поэтому когда пишется та или иная функция она пишется приблизительно под ограниченное количество задач которые на данном этапе очевидны. Но как правило спустя некоторое время находится еще какая нибудь задача которая похожа, но о которой я еще даже не думал, и стоит два варианта:
1) Переделать функцию как более обобщенную и все места ее вызова
2) написать ниже новую похожую.

Проблема по которой в больших случаях пока предпочтение уходит 2-му варианту заключается в том что, если обобщить старую функцию нужно переосмыслить всю логику, и учесть все новые нюансы совместив их со старыми, что как правило приводит к ошибкам логики (по неопытности).  А потом возможно появиться необходимость обобщить ее еще раз... неявные ошибки неизбежны.

Сложно когда нет опыта построения проектов. Когда удается в самом начале разложить все по полочкам и предусмотреть хотя бы всю высшую абстракцию.
PM MAIL   Вверх
mes
Дата 18.8.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Vladimiir @  17.8.2010,  21:33 Найти цитируемый пост)
This dummy assignment removes that compiler warning. 

значит все таки для ворнингов ))  smile 


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 18.8.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

This dummy assignment removes that compiler warning.

Просто жесть.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1007 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.