Новая версия платформы MetaTrader 5 build 2085: Интеграция с Python и массовые улучшения в тестере стратегий - страница 21

Dmitrii Boldyshevskii
334
Dmitrii Boldyshevskii  
У меня одного после обновления перестали некоторые индикаторы работать?
Sergey Basov
7236
Sergey Basov  
Konstantin:

скиньте ссылку на нее если не сложно

Обычного Process Explorer от Руссиновича хватает для этого.

https://docs.microsoft.com/ru-ru/sysinternals/downloads/process-explorer

Alexey Navoykov
4413
Alexey Navoykov  

Давно напрягает длительное время компиляции кодов.  Точнее даже не столько компиляции, сколько синтаксической проверки.   К примеру, .mq5 файл в режиме Optimize=0 компилируется 9 секунд.  Если же сделать из него .mqh файл и запустить компиляцию(синтаксическую проверку) этого файла, то затрачивается 8 секунд.

Т.е. именно парсинг и проверка синтаксиса занимает основное время.   Общий объём используемых библиотек - около 3 мб, это немного.  Так что, вероятно, выполняются какие-то лишние действия в процессе проверки.  Либо же следует оптимизировать сам процесс.  К примеру, если какие-то файлы исходника не изменились со времени предыдущей компиляции, то зачем их снова парсить?  Это ж вроде очевидная вещь.  Зачастую мы только в одном файле что-то меняем.   Но у вас процесс компиляции/проверки всегда начинается с нуля и занимает одинаковое время. Это неразумно.

Alexey Navoykov
4413
Alexey Navoykov  

Недоработка компилятора:

struct A
{ 
  char x;
  A() { x=0; }
};

struct B : A { };

void OnStart()
{
  A a;
  B b;
  b=a;  // Нет ошибки компиляции!
}

Здесь должна выдаваться ошибка. Производному классу не может присваиваться базовый класс.  Ибо для этого A& должен неявно каститься к B&, а такая операция недопустима. Да и противоречит это всё здравому смыслу.

Это прописано в правилах C++:

An object of any unambiguously derived class from a given base class can be assigned to an object of the base class. The reverse is not true because there is an implicit conversion from derived class to base class but not from base class to derived class. For example:

class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};
class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

Поэтому можно разрешить такое присвоение, только если явно задан оператор  ADerived::operator=(const ABase&),  но никак не для неявных операторов.   Иначе это постоянный источник трудноуловимых ошибок. 

Sergey Dzyublik
4162
Sergey Dzyublik  
Alexey Navoykov:

Недоработка компилятора:

Здесь должна выдаваться ошибка. Производному классу не может присваиваться базовый класс.  Ибо для этого A& должен неявно каститься к B&, а такая операция недопустима. Да и противоречит это всё здравому смыслу.

А если у вас базовый клас имеет 50 полей, то при наследовании, если нужен операторе присвоения, каждый раз ручками прописывать все 50 полей? 
Когда не нужен дефолтный оператор присвоения, или конструктор копирования - просто позначте их как delete:

struct A
{ 
  char x;
  A() { x=0; }
};

struct B : A { 
   void operator=(A &) = delete;
};

void OnStart()
{
   A a;
   B b;
   
   b=b;
   b=a;  // attempting to reference deleted function 'void B::operator=(A&)'    
}
Alexey Navoykov
4413
Alexey Navoykov  
Sergey Dzyublik:

А если у вас базовый клас имеет 50 полей, то при наследовании, если нужен операторе присвоения, каждый раз ручками прописывать все 50 полей?  

Причём здесь это?  Вы видимо не совсем поняли, о чём речь.  Мы говорим о типоконтроле при присваивании класса извне.  На внутреннюю работу это не влияет.  В приведённых мной выше случаях, вы можете без проблем делать aDerived=aDerived, всё само скопируется как надо.  Равно как и aBase=aDerived  или aBase=aBase
Carl Schreiber
Модератор
8285
Carl Schreiber  

Поскольку я не знаю, где размещать проблемы на MQ-сайте, я размещаю его здесь:

Несколько раз я внезапно испытывал это, не зная точно, почему, - окно, в котором я хочу опубликовать сообщение (ответ), блокируется «загрузить картинку», и я не могу избавиться от этого, независимо от того, что я нажмите кнопку. :(

Я не могу сохранить то, что уже написал, и мне нужно отменить запись, чтобы начать заново с начала. :(

Вот как это выглядит:

As I don't know where to post problems of the MQ-Website I post it here:

Several time I experienced that all of a sudden - with out knowing excatly why - the window in which I want to post a message (answer) is blocked by "upload picture" and I can't get rid of that, no matter what I click. :(

I can't save what I have already written and have to cancel the entry to re-start from thze beginning. :(

This is how it looks:


fxsaber
14160
fxsaber  
Carl Schreiber:

Чтобы не потерять свою запись, жмите на кнопку публикации. Появится новый незавершенный пост. Затем жмите на кнопку "правка" и дописывайте свой пост.

Vladimir Karputov
Модератор
180346
Vladimir Karputov  
fxsaber:

Чтобы не потерять свою запись, жмите на кнопку публикации. Появится новый незавершенный пост. Затем жмите на кнопку "правка" и дописывайте свой пост.

Да, я тоже так спасаю свои публикации: срочно жму "Добавить" и потом уже редактирую. Причина появления картинки на весь экран плавающая - воспроизвести трудно.

Alexey Navoykov
4413
Alexey Navoykov  

В продолжение темы об операторах присваивания.  Вскрылся ещё один баг, только уже на этапе выполнения:

struct A
{
  void operator=(const A& other) { Print(__FUNCTION__);  }
};

struct B : A
{
  int _b;
};

struct C : B
{
  C(int b) { _b= b; }
  void operator=(const C& other) { B::operator=(other); }
};

void OnStart()
  {
    C c1(1), c2(2);
    c1 = c2;
    Print(c1._b); // Результат = 1,  т.е. класс B не скопировался
  }

Из распечатки видим, что класс B не скопировался, т.е. неявный оператор для него не вызывался.

При этом оператор для класса A вызывался.  Т.е. перескочили через B.

В C++ всё работает как положено.