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

 
Igor Makanu #:

ЗЫ: еще видел макросы вида

Не понял.

 
fxsaber #:

Не понял.

в сети много информации об удобстве такого макроса, гуглить "macro while 0"

https://russianblogs.com/article/9410298326/

 

В этой ветке уже был давно пример while(0)

https://www.mql5.com/ru/forum/170952/page141#comment_12897922

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
На всякий случай уточню - это только для static (это все про C++). Для локальных переменных, если есть пользовательский к-тор, то обнуления нет.

Мне понравилось само объяснение, которое никак не противоречит ООП.

При создании объекта просто структуры происходит следующее:

  1. Выделяется память под структуру - там любой мусор.
  2. На этом куске запускается конструктор.

Когда идет объявление через {}, между пунктами 1-2 вставляется еще один - забивание нулями выделенной памяти.


При такой логике ООП никак не страдает. Валидный механизм.

 
fxsaber #:

    Когда идет объявление через {}, между пунктами 1-2 вставляется еще один - забивание нулями выделенной памяти.

    При такой логике ООП никак не страдает. Валидный механизм.

    Здесь страдает сама логика: зачем обнулять, если потом все равно конструктор будет?

     
    A100 #:

    Здесь страдает сама логика: зачем обнулять, если потом все равно конструктор будет?

    Потому что структура с конструктором не может быть использована в union.

     
    Ilyas #:

    Для union инициализируем только первый член, поменяйте местами поля и тест будет проходить.
    Подумаем, стоит-ли в ущерб скорости менять поведение, чтобы оно стало таким, каким ожидает его большинство пользователей.

    Считайте что поменял - теперь проверяю 1ый член на равенство нулю x[i].i == 0 (ранее условие было x[i].x == 0.0)

    union X {
        int i;
        double x;
    };
    void OnStart()
    {
        X x[10000] = {}; //(*)
        bool b = true;
        for ( int i = 0; i < ArraySize(x) && (b = (x[i].i == 0)); i++ );
        Print( b );
    }

    Результат: false

    А с ZeroMemory - true

     
    Igor Makanu #:

    в сети много информации об удобстве такого макроса, гуглить "macro while 0"

    https://russianblogs.com/article/9410298326/

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

     
    A100 #:

    Считайте что поменял - теперь проверяю 1ый член на равенство нулю x[i].i == 0 (ранее условие было x[i].x == 0.0)

    Результат: false

    А с ZeroMemory - true

    Да. баг mql

    (а  в C++ возвращается true).

     
    Как теперь (b3110) обнулить непростую структуру?
    struct MqlTick2 : private MqlTick
    {
    //  string Str; // С этой строкой не обнулить.
    };
    
    
    template <typename T>
    void ZeroMemoryStruct( T &Struct )
    {
      uchar Bytes[sizeof(T)];
      
      ::CharArrayToStruct(Struct, Bytes);
    }
    
    void OnStart()
    {
      MqlTick2 Tick;
    
      ZeroMemoryStruct(Tick);  
    }