Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: билдер  (Прочитано 3217 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

ru
Offline Offline

« : 06-08-2007 07:08 » 

вот такие дела

Код:
class CStr 
{
protected:
  mutable BOOL                m_fDirectAlert;     
  mutable size_t              m_stLength;         
  size_t                      m_stMaximumLength; 
  TCHAR*                      m_pData;
};

class CMultiStr : protected CStr
{
protected:
  mutable  size_t    m_stCount;
public:
  void* BufferPtr();
};

void* CMultiStr::BufferPtr()
{
  m_fDirectAlert = 1;
  return m_pData;
}

До вызова m_stCount = 0; m_fDirectAlert = 0; m_stLength = 0

Вызываю BufferPtr()
Код:
CMultiStr  mstr;
mstr.BufferPtr();


После этого m_stCount = 1; m_fDirectAlert = 0; m_stLength = 1. Причем в Visual C все работает.

Использую Borland® C++Builder® for Microsoft® Windows™ Version 10.0.2166.28377 Copyright © 2005 Borland® Software Corporation. All Rights Reserved. Update 1

Смотрел дизассемблером какая то чертовщина.

Код:
void* CMultiStr::BufferPtr()
0040D760 55               push ebp
0040D761 8BEC             mov ebp,esp

m_fDirectAlert = 1;
0040D763 8B4508           mov eax,[ebp+$08]
0040D766 C7401001000000   mov [eax+$10],$00000001 //Вот в этом месте ячейка памяти [eax+$10] остается равной 0!!!

return m_pData;
0040D76D 8B5508           mov edx,[ebp+$08]
0040D770 8B421C           mov eax,[edx+$1c]

Помогите!!!
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #1 : 06-08-2007 07:54 » 

Разобрался. Это эффект IDE при вычислении __declspec( property(...)) .
Код:

class CMultiStr {
: ...

__declspec( property( get = getCount))
size_t                                    Count;
};
 
size_t  CMultiStr::getCount() const
{
  if ( m_fDirectAlert)
  {
     ...
     m_fDirectAlert = 0;
  }
  else return m_stCount;
}


Оболочка IDE выполняет эту функцию в своем потоке, для того что бы отобразить мне в "tooltip expression evaluation" значение свойства Count.
« Последнее редактирование: 06-08-2007 08:01 от sss » Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines