Пара вопросов по работе со структурами

 

Есть структура:

struct LastExecutedSignal {
  string    symbol;
  ENUM_ORDER_TYPE  type;
  ulong     magic;
  datetime  time;
  double    price;
  double    unrealizedLot;
  bool      isRealized;
};

Если есть 2 её экземпляра, скажем так, signal1 и signal2 их кроме как поэлементно я так понимаю сравнить нет возможности?

Вот так не выходит:

signal1 == signal2

Присвоить одну структуру другой тоже нельзя, вот так:

signal1 = signal2

Какие тогда есть варианты вообще? Я смотрю, что в мкл структуру какие-то странные. Функционала нет. Назначение их как я вижу лишь название общее у группы переменные т.е. объединение по свойству и передача куда-нить. Хотя, по сути, всё это решается классом.

 
hoz:

Есть структура:

Если есть 2 её экземпляра, скажем так, signal1 и signal2 их кроме как поэлементно я так понимаю сравнить нет возможности?

Вот так не выходит:

Присвоить одну структуру другой тоже нельзя, вот так:

Какие тогда есть варианты вообще? Я смотрю, что в мкл структуру какие-то странные. Функционала нет. Назначение их как я вижу лишь название общее у группы переменные т.е. объединение по свойству и передача куда-нить. Хотя, по сути, всё это решается классом.

Попробуйте убрать из структуры поле string и сравнить при помощи "==". Получится?

 
hoz:

Есть структура:

Если есть 2 её экземпляра, скажем так, signal1 и signal2 их кроме как поэлементно я так понимаю сравнить нет возможности?

Вот так не выходит:

Присвоить одну структуру другой тоже нельзя, вот так:

Какие тогда есть варианты вообще? Я смотрю, что в мкл структуру какие-то странные. Функционала нет. Назначение их как я вижу лишь название общее у группы переменные т.е. объединение по свойству и передача куда-нить. Хотя, по сути, всё это решается классом.

Нормальные структуры в MQL. Правильные.

Поэлементно и сравнивай. 

В общем случае структуры нельзя сравнивать через "простое равно", как минимум, в них могут быть строки. А возможен и более хитрый случай - в структуре может быть указатель на объект. Будешь сравнивать две таких структуры, в которых указатели на одинаковые объекты - и получишь ошибку. При "общем" сравнении - ты получишь, что структуры разные (указатели-то в них разные). А реально - это будут одинаковые структуры, поскольку указатели будут указывать на одинаковые объекты.

Через "простое равенство" просто визуально удобно записывать сравнение структур, но для общего случая методика простого сравнения не годится. А для классов - вобще следует перегружать оператор сравнения, чтобы написанное простое сравнение "раскрывалось" в функцию сравнения, которая учитывает структуру класса.
 

можно еще заменить

string    symbol;

на статический массив

uchar    symbol[20];
 
Vladimir Karputov:

Попробуйте убрать из структуры поле string и сравнить при помощи "==". Получится?

Нет. Я скрипт простой накидал. Даже так не сравнивается:

struct struct1 {
  int    i;
  double d;
  bool   b;
};

struct struct2 {
  int    i;
  double d;
  bool   b;
};

void OnStart() {
//---
  struct1 str1;
  struct2 str2;
  ZeroMemory(str1);
  ZeroMemory(str2);
  str1.i = 5;
  Print("str1.i = ", str1.i);
  Print("str2.i = ", str2.i);
  Print("str2 == str1 ? ", str2 == str1);
//  str2 = str1;
  Print("str1.i = ", str1.i);
  Print("str2.i = ", str2.i);
  //Print("str2 == str1 ? ", str2 == str1);
}
 
Georgiy Merts:

Через "простое равенство" просто визуально удобно записывать сравнение структур, но для общего случая методика простого сравнения не годится. А для классов - вобще следует перегружать оператор сравнения, чтобы написанное простое сравнение "раскрывалось" в функцию сравнения, которая учитывает структуру класса.

Ну так понятно, что обычно не так. Я всегда сравниваю (не в мкл есс-но) экземпляры с помощью equals. Здесь такого нет, поэтому и .. попробывал обычным сравнением.

 
можно определить свои операторы
 

Структура это по сути классы, то есть в них можно добавлять методы, переопределять операторы. Для вашей задачи необходимо переопределить операторы присваивания и сравнения.

struct LastExecutedSignal {
  string    symbol;
  ENUM_ORDER_TYPE  type;
  ulong     magic;
  datetime  time;
  double    price;
  double    unrealizedLot;
  bool      isRealized;

  void operator=(LastExecutedSignal &signal);
  bool operator==(LastExecutedSignal &signal);
};

bool LastExecutedSignal::operator==(LastExecutedSignal &signal)
{
   if(symbol!=signal.symbol)return(false);
   if(type!=signal.type)return(false);
   if(magic!=signal.magic)return(false);
   if(time!=signal.time)return(false);
   if(price!=signal.price)return(false);
   if(unrealizedLot!=signal.unrealizedLot)return(false);
   if(isRealized!=signal.isRealized)return(false);
//---
   return(true);
}
void LastExecutedSignal::operator=(LastExecutedSignal &signal)
{
   symbol=signal.symbol;
   type=signal.type;
   magic=signal.magic;
   time=signal.time;
   price=signal.price;
   unrealizedLot=signal.unrealizedLot;
   isRealized=signal.isRealized;
}
 
Alexey Valeev:

Структура это по сути классы, то есть в них можно добавлять методы, переопределять операторы. Для вашей задачи необходимо переопределить операторы присваивания и сравнения.

Интересная реализация. Благодарю за наводку!

 
hoz:

Интересная реализация. Благодарю за наводку!

Только так вы и сможете выполнять данные действия со структурой.

signal1 == signal2
signal1 != signal2
 
hoz:

Ну так понятно, что обычно не так. Я всегда сравниваю (не в мкл есс-но) экземпляры с помощью equals. Здесь такого нет, поэтому и .. попробывал обычным сравнением.

Хм... А что такое equals ? В С++ такого тоже нет.

Сравнивать необходимо поэлементно, а в объектах - должна быть специальная функция сравнения.

Причина обращения: