Как передать структуру из одного объекта в другой - страница 2

 
Ekaterina Belova:

Проблема в компиляции. Как создать метод в классе по получению структуры ведь не задана структура  ExtremumsStr      MM[]; . Получается нужно задать другую структуру того же типа во втором классе и передать в нее структуру MM[], но это потребует много ресурсов и замедлит выполнение программы. Что за способ с указателями?

Метод в классе - параметр у него должен быть с типом этой структуры, при вызове метода передавать туда структуру. 

С указателями - объявлять так:

ExtremumsStr   *   MM[];  

Потом создавать через new, но по завершению работы программы надо удалять - delete. Но это не значит, что указатель будет видим везде, его так же передават в метод надо будет.

Просто объявите структуру не в классах, а на глобальном уровне и все проблемы решатся.

 
Ekaterina Belova:
 

Что за способ с указателями?

Посмотрите как устроены классы массивов (типа CArrayInt) в Стандартной Библиотеке.

Там, где требуется массив - можно объявить "обычный" MQL-массив int-значений, а можно объявить объект типа CArrayInt. При этом в последнем случае - имеется возможность передавать в качестве результата или параметра не сам объект, а указатель на него. По аналогии делается класс, в котором вместе массива - ваша структура. После этого - вы можете передавать не саму структуру (которая может быть весьма объемной) - а лишь указатель на объект.

Для начинающих, думаю, неплохая идея с объявлением структур на глобальном уровне.

 
George Merts:

Посмотрите как устроены классы массивов (типа CArrayInt) в Стандартной Библиотеке.

Там, где требуется массив - можно объявить "обычный" MQL-массив int-значений, а можно объявить объект типа CArrayInt. При этом в последнем случае - имеется возможность передавать в качестве результата или параметра не сам объект, а указатель на него. По аналогии делается класс, в котором вместе массива - ваша структура. После этого - вы можете передавать не саму структуру (которая может быть весьма объемной) - а лишь указатель на объект.

Для начинающих, думаю, неплохая идея с объявлением структур на глобальном уровне.


Это без разницы, все равно массивы передаются по ссылке. Указатели полезны, когда перемещать объекты надо, типа сортировки массив объектов и т.п. 
 
Dmitry Fedoseev:
 

С указателями - объявлять так:

Не обязательно объявлять по new, можно просто объявить в виде:

СExtremumsStr   objMM;                         // СExtremumsStr - класс, в который "обернут" массив MM;   objMM - объявление объекта этого класса

СExtremumsStr *  pMM = GetPointer(objMM);      // Объявляем указатель  pMM  и "указываем" его на объявленный выше объект.

Только надо помнить, что в момент удаления объекта - указатель становится невалидным, им можно пользоваться только пока сам объект существует.

 
Dmitry Fedoseev:

Это без разницы, все равно массивы передаются по ссылке. Указатели полезны, когда перемещать объекты надо, типа сортировки массив объектов и т.п. 
На мой взгляд, главное преимущество указателей - их можно запомнить для дальнейшего использования. А массив, переданный по ссылке - никак не запомнишь, только копировать.
 
new если заранее неизвестно количество объектов, или сортировать их надо, в остальных случаях без new, чтобы не заморачиваться удалением объектов. 
 
Dmitry Fedoseev:
new если заранее неизвестно количество объектов, или сортировать их надо, в остальных случаях без new, чтобы не заморачиваться удалением объектов. 
Да, согласен. Или если заранее неизвестен конкретный тип объекта из одной иерархии.
 
Большое спасибо.
 
Тоже столкнулся с проблемой передачи по ссылке массива структуры во включаемый файл. Помогло это обсуждение. Самый простой вариант, действительно, сделать отдельный включаемый файл с объявлением структур и включить его во все файлы проекта. Так всё работает отлично.
 

Коллеги помогите чайнику.

Есть функция в которую нужно передавать одну из 10 структур в зависимости от условия, где в процессе работы будет происходить её заполнение данными. Описание структур выглядет так

struct Acum {datetime time;
             double   oi;
             double   dl;
};
Acum DATA_BR[];
Acum DATA_ED[];
Acum DATA_Eu[];
Acum DATA_GAZR[];
Acum DATA_GOLD[];
Acum DATA_LKOH[];
Acum DATA_MGNT[];
Acum DATA_MIX[];
Acum DATA_MXI[];
Acum DATA_ROSN[];
Acum DATA_RTS[];
Acum DATA_SBRF[];
Acum DATA_Si[];
Acum DATA_VTBR[];

Скажите они описаны правильно?

А вот так вызываю функцию где в переменную DataStruc и должна передаватся выбранная струкутра, однако компилятор выдаёт ошибку, не могу понять как это сделать???

bool Load_File(string Name_File, struct &DataStruc[])


Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
Причина обращения: