Особенности языка mql5, тонкости и приёмы работы - страница 214

 
fxsaber #:

Не встречал ранее такой записи.

Пользуйся)))

 
Vladimir Simakov #:

Пользуйся)))

Владимир, где Вы берете такие схемы?, мне помогли тогда, в моей теме по поиску баров, минимальным циклом, где-то есть готовые образы? я самоучка, в другом профиле изначально

просто так собирать логические схемы, складывать, прокручивать в циклах...
 
Vladimir Simakov #:

Так это же баг лютый. Пример:

Память выделена, деструктор при ее освобождении вызван (что про ожидаемое, в соответствии с RAII, поведение, как бы намекает), а вот конструктор при создании объекта, вызвать забыли)))

Это 2ая {} ошибка

Напомню: 1ая с подвисанием, 3я с union

 
Vladimir Simakov #:

Пользуйся)))

ох уж эти постинкрементные лаконичности... )
 
Fast235 #:

Владимир, где Вы берете такие схемы?, мне помогли тогда, в моей теме по поиску баров, минимальным циклом, где-то есть готовые образы? я самоучка, в другом профиле изначально

просто так собирать логические схемы, складывать, прокручивать в циклах...

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

 
Vladimir Simakov #:

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

ваши поиски баров, были с перечислениями и шаблонами)) 

шаблоны откладывал на почти никогда изучение, но вникнул буквально за час.

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

--

add

это все на форуме, просто спасибо.

 
Vladimir Simakov #:

Так это же баг лютый. Пример:

Память выделена, деструктор при ее освобождении вызван (что про ожидаемое, в соответствии с RAII, поведение, как бы намекает), а вот конструктор при создании объекта, вызвать забыли)))

Спасибо за сообщение.
Исправил.

Данный код будет выдавать ошибку компиляции, т.к. инит-последовательности в MQL пока неполноценные.

Для структур, инициализация последовательностью не заменяется на вызов конструктора с соответствующими параметрами -  мы планируем это добавить (пока отложено на неопределённый срок, но часть нового кода "просочилась" в продакт).



 

@A100

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

A100, 2021.11.16 13:43

Смысла нет, потому что:

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5 подвисает. Кроме того, это противоречивый обход конструктора


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

A100, 2021.11.17 02:20

Вы сами 4ую ошибку сообщили. А чем ZeroMemory хуже {} ? Т.е. имеем некий несанкционированный механизм доступа к private, который компилятор почему то не обнаруживает.

Расчет на то, что Разработчики не будут это исправлять? Когда то компилятор и на ZeroMemory не реагировал


Если вспомнить, что mql порожден от C++, то там оба эти примера (их аналоги) хорошо работают, потому что в этих классах нет конструкторов (т.е. есть имплицитный конструктор):

  • Объявление ClassX x[n]={}; приводит к value-initialization каждого элемента массива.
  • Если у ClassX нет пользовательских конструкторов (но есть неудаленный конструктор по умолчанию), то производится zero-initialization объектов класса - независимо от наличия private полей.
  • Но если есть const поля, то ктор по умолчанию будет неявно удален, поэтому ошибка компилятора.

Пример в C++:

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

Так что если в структуре /классе нет const полей, то логика работы корректная.

 
Забыл добавить, что если в классе есть нетривиальные поля (объекты), то после zero-init всего объекта для таких полей будет вызван их default c-tor.
 
fxsaber #:

Не встречал ранее такой записи.

посмотрел на свои изыскания в MQL5, бывает и хуже, я даже так историю в индикаторе по нескольким ТФ подкачиваю:

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


в оператор for много что можно записать ))) 

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