перекрестные ссылки - страница 2

 
Igor Makanu:

да дескриптор, не идентификатор как написал

но чем отличаются вызовы методов в этом коде ?

Ничем.

В MQL дескриптор очень часто ведёт себя как объект. То есть, автоматически разыменовывается.

В строке

A *c = GetPointer(a);

фактически берётся не дескриптор указателя, а дескриптор объекта, на который он указывает.

В C++ пришлось бы писать так:

A *c = GetPointer(*a);
 
Koldun Zloy:

Ничем.

В MQL дескриптор очень часто ведёт себя как объект. То есть, автоматически разыменовывается.

В строке

фактически берётся не дескриптор указателя, а дескриптор объекта, на который он указывает.

В C++ пришлось бы писать так:

ОК, теперь понял!

Спасибо!

 
Igor Makanu:

да дескриптор, не идентификатор как написал

но чем отличаются вызовы методов в этом коде ?

А зачем ты один и тот же объект три раза удаляешь?)))

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

 
Koldun Zloy:
В MQL this это ссылка, а Вы хотите её присвоить указателю.
Странно, что ошибка возникает во время выполнения.
Она должна быть уже при компиляции.

еще вопрос, если позволите )

Это из стандартной библиотеки

int CArrayObj::Search(const CObject *element) const
  {
   int pos;
//--- check
   if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1)
      return(-1);
//--- search
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- not found
   return(-1);
  }

зачем тогда *element в параметрах метода и ниже CheckPointer, если &element уже получит указатель (дескриптор) ?

Нижний кусок получается эквивалентным верхнему, так?

int CArrayObj::Search(const CObject &element) const
  {
   int pos;
//--- check
   if(m_data_total==0 || !element || m_sort_mode==-1)
      return(-1);
//--- search
   pos=QuickSearch(element);
   if(m_data[pos].Compare(element,m_sort_mode)==0)
      return(pos);
//--- not found
   return(-1);
  }
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Nikolai Karetnikov:

еще вопрос, если позволите )

Это из стандартной библиотеки

зачем тогда *element в параметрах метода и ниже CheckPointer, если &element уже получит указатель (дескриптор) ?

Нижний кусок получается эквивалентным верхнему, так?

Они не эквивалентны и оба не правильны.

Правильно так:

int CArrayObj::Search(const CObject *element) const
{
   int pos;
//--- check
   if( m_data_total == 0 || CheckPointer( element ) == POINTER_INVALID || m_sort_mode == -1 )
      return -1;
//--- search
   pos = QuickSearch( element );
   if( m_data[pos].Compare( element, m_sort_mode ) == 0 )
      return pos;
//--- not found
   return -1;
}
 
POINTER_INVALID равен 0. Поэтому код !CheckPointer(element) - правильный. Только не канонический))
 
Koldun Zloy:

Они не эквивалентны и оба не правильны.

Правильно так:

по телу метода вопросов нет, по сигнатуре есть

чем, 

int CArrayObj::Search(const CObject *element)

отличается от 

int CArrayObj::Search(const CObject &element)

?

во втором случае, & берет указатель от element, а что делает * в первом?

 
Nikolai Karetnikov:

по телу метода вопросов нет, по сигнатуре есть

чем, 

отличается от 

?

во втором случае, & берет указатель от element, а что делает * в первом?

В первом случае в функцию приходит указатель, во втором случае ссылка.

Здесь & обозначает не операцию взятия адреса, а тип аргумента - ссылка.

CObject*  -  указатель на объект.
CObject&  -  ссылка на объект.
 
Nikolai Karetnikov:

по телу метода вопросов нет, по сигнатуре есть

чем, 

отличается от 

?

во втором случае, & берет указатель от element, а что делает * в первом?

В первом случае ты передаешь дескриптор на объект, при этом определяешь его (объект) const. А во втором случае - не указатель, а ссылка. Если во втором случае, ты передашь в метод ссылку на невалидный объект, то у тебя все в run-time упадет. Поэтому в СБ, правильно.

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

int CArrayObj::Search(const CObject* const element)
 
В один из них можно передать динамически созданный объект, а в другой - автоматически созданный.