Ошибки, баги, вопросы - страница 1838

 

Прошу помощи, у самого ступор. Для объяснения написал такой скрипт

struct STRUCT 
{
  int a;
};

class CLASS
{
public:
  int a;
};

STRUCT f1()
{  
  static int i = 0;
  
  STRUCT Res;
  
  Res.a = i++;   
  
  return(Res);
}

CLASS* f2()
{
  static int i = 0;
  
  CLASS* Res = new CLASS;
  
  Res.a = i++;
  
  return(Res);
}

void OnStart()
{
  int i1 = f1().a + f1().a;  
  int i2 = f2().a + f2().a;
}

Есть структура и есть аналогичный класс. Мне нужно, чтобы после расчета i2 соответствующие объекты класса удалялись самопроизвольно, как это происходит с объектами структуры, когда идет аналогичный расчет i1. Как такое провернуть?

 

fxsaber:

Как такое провернуть?

Завернуть в умный указатель, не уверен что это можно сделать средствами mql
 
Комбинатор:
Завернуть в умный указатель, не уверен что это можно сделать средствами mql
Сама проблема возникла из-за невозможности возврата сложной структуры. Например, если в коде выше вместо int a; сделать string a;, то f1() будет обламываться на return. Поэтому взгляд упал на классы, но там ожидала описанная засада.
 

Вообще можно переопределить копи конструктор и оператор=

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

 
Комбинатор:

Вообще можно переопределить копи конструктор и оператор=

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

Вот Спасибо! Меня останавливало от этого решения недавно снятое ограничение. Теперь пашет
struct STRUCT
{
  string Str;

  template <typename T>
  void operator =( const T Value )
  {
    Print(__FUNCTION__);
  }
  
  void operator =( const STRUCT &Struct )
  {
    this.Str = Struct.Str;
  }
};

STRUCT f()
{
  STRUCT Res;
  
  return(Res);
}

void OnStart()
{
  f() = 1;
}
 

При оптимизации советника появляется вот такая ошибка

genetic pass (0, 3) tested with error "critical runtime error 512 in OnTimer function (sleep function reaches end of test)" in 0:37:20.429 + history synchronization 0:00:43.395

Одиночное тестирование проходит без ошибок.

Версия у MT5 и MetaEditor  1571.

 
pivomoe:

При оптимизации советника появляется вот такая ошибка

genetic pass (0, 3) tested with error "critical runtime error 512 in OnTimer function (sleep function reaches end of test)" in 0:37:20.429 + history synchronization 0:00:43.395

Выкинуть из советника максимум, чтобы ошибка воспроизводилась. И опубликовать оставшийся код.

 

Здравствуйте. Не могу понять в чем проблема. Робот сделки в терминале МТ4 открывает и работает как надо, а в тестере не хочет.

Вот участок кода, ответственный за открытие сделки:

   ArraySetAsSeries(MaxBuffer,true);
   ArraySetAsSeries(MinBuffer,true);
   ArraySetAsSeries(BufferExUp,true);
   ArraySetAsSeries(BufferExDown,true);
   ArraySetAsSeries(TimeBuffer,true);
   xMax=CopyHigh(_Symbol,_Period,1,NumBars+NBars+1,MaxBuffer);
   xMin=CopyLow(_Symbol,_Period,1,NumBars+NBars+1,MinBuffer);

   for(int i=NBars;i<=NumBars;i++)
     {
      xMaxH=ArrayMaximum(MaxBuffer,i,0);
      xMaxHD=ArrayMaximum(MaxBuffer,i+NBars,0);
      if((MaxBuffer[xMaxH]>=MaxBuffer[xMaxHD])&&(xMaxH>=NBars))
        {
         Maximum=MaxBuffer[xMaxH];
         for (int x=0; x<=OrdersTotal();x++)
          {if (OrderSelect(x,SELECT_BY_POS))
            {if (StringToDouble(OrderComment())==Maximum)
              {y=1;
               break;}
             else y=0;}}
       
         if (y==0)
           {int send1=OrderSend(Symbol(),OP_BUYSTOP,Volume1,Maximum,0,0,0,DoubleToString(Maximum,_Digits),0,0,Red);}}}

Подобный код работает и в МТ5  в реале и в тестере без проблем и повторяет его точь в точь (кроме OrderSend естественно и ArrayMaximum), проблемы возникли при переводе на МТ4, но опять же, не могу понять как это возможно ведь в терминале на графике все ОК.

 
И журнал молчит, просто идет тестирование в холостую.
 
Когда-то типу string был добавлен оператор []
string Str = "ABC";
Print(CharToString(Str[1])); // B


Возможно ли со стороны разработчиков добавить оператор = для массивов?

int a[], b[];
a = b; // ArrayCopy(a, b);


Поскольку указателей нет, то подобный оператор сделал бы язык более гибким - нашлись ситуации, когда это было бы ОЧЕНЬ удобно.