MQL4 Отправить массив объектов в качестве параметра функции - PullRequest
0 голосов
/ 06 октября 2019

У меня была функция в качестве члена класса с массивом моего пользовательского объекта в качестве параметра:

class Stochastic { ... some class which sent into initializeStochastics method as param };

class StochasticInitializer {
    public:
        Properties *properties[8];

    public:
        StochasticInitializer(void) {
           this.properties = ... 
        }

    public:
        void initializeStochastics(Stochastic& *stochastics[]) { // This param is my problem
            for (int i = 0 ;i < ArraySize(properties); i++) {
                if (properties[i].enabled) {
                    stochastics[i] = new Stochastic(properties[i]);
                }
            }
        }
};

Мои ошибки:

'&' - comma expected
']' - declaration without type
']' - comma expected
'initializeStochastics' - wrong parameters count
'stochastics' - undeclared identifier

Я беру синтаксис из здесь , но, возможно, это решение для MQL5.

Можно ли отправить массив экземпляров класса в качестве параметра метода в MQL4? Если «да» - как, если нет - тоже отвечает.

1 Ответ

1 голос
/ 07 октября 2019

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

class Properties
  {
public:
   bool  enabled;
   int   periodK;
   Properties(bool _enabled,int k):enabled(_enabled),periodK(k){}
  ~Properties(){}
  };
class Stochastic
  {
public:
   int   periodK;

   Stochastic(){}
  ~Stochastic(){}
   Stochastic(Properties *prop):periodK(prop.periodK){}

   double get(const int shift,const int buffer=0)const{return iStochastic(_Symbol,0,periodK,3,3,MODE_SMA,STO_LOWHIGH,buffer,shift);}
  };
class StochasticInitializer
  {
public:
   Properties *properties[8];

   StochasticInitializer()
     {
      Deinit();
      properties[0]=new Properties(true,5);
      properties[1]=new Properties(true,13);
      properties[2]=new Properties(true,14);
      properties[3]=new Properties(true,15);
      properties[4]=new Properties(true,16);
      properties[5]=new Properties(true,17);
      properties[6]=new Properties(true,18);
      properties[7]=new Properties(false,19);
     }
  ~StochasticInitializer(){Deinit();}
   void        Deinit(const int reason=0){   for(int i=0;i<ArraySize(properties);i++)delete(properties[i]);   }
   void        initializeStochastics(Stochastic *&stochastics[])// THIS IS WHAT YOU NEED IN CASE OF POINTERS
     {
      for(int i=0;i<ArraySize(properties);i++)
        {
         if(properties[i].enabled)
           {
            stochastics[i]=new Stochastic(properties[i]);
           }
        }
     }
  };
StochasticInitializer initializer;
void OnTick()
    {
       Stochastic *array[8];    //THIS IS ARRAY OF POINTERS
       initializer.initializeStochastics(array);
       for(int i=0;i<ArraySize(array);i++)
         {
          printf("%i %s: %d %s",__LINE__,__FILE__,i,CheckPointer(array[i])==POINTER_INVALID ? "null" : (string)array[i].periodK);
         }
       for(int i=ArraySize(array)-1;i>=0;i--)delete(array[i]);//DELETING POINTERS
       ExpertRemove();
    }
...