Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - страница 10

 
fxsaber #:

Нет ведь однозначности для методов/функций и полей/переменных.

Строка для поиска: Uluchshenie 131.

Область видимости (далее скоп) в новой версии MQL имеет свой список именованных объектов компиляции (переменные, функции и т.д.)

Обход дерева скопов при поиске именованной сущности происходит от текущего скопа к глобальному корню, до первого найденного, что приводит к сокрытию всех сущностей с тем же именем в скопах выше по дереву.


В скопе A имеется 'Func1' принимающий строку, но внутри скопа A при вызове 'Func1' передаётся целое.
Если раньше такой код приводил к тому, что внутри A вызывалась глобальная ::Func1, то теперь, поиск "не видит" глоальной.

Мы уже 5 лет назад предупреждали на форуме о данном предстоящем изменении и в компиляторе до версии 5200 можно было видеть предупреждение компиляции "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version"

 
Ilyas #:

Обход дерева скопов при поиске именованной сущности происходит от текущего скопа к глобальному корню, до первого найденного, что приводит к сокрытию всех сущностей с тем же именем в скопах выше по дереву.

Для переменных/полей hiding-предупреждение не работает специально?
 
Ilyas #:

Мы уже 5 лет назад предупреждали на форуме о данном предстоящем изменении и в компиляторе до версии 5200 можно было видеть предупреждение компиляции "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version"

У меня все проекты компилировались без единого предупреждения. b5200 изменил ситуацию в корне.

 
Ilyas #:

В скопе A имеется 'Func1' принимающий строку, но внутри скопа A при вызове 'Func1' передаётся целое.
Если раньше такой код приводил к тому, что внутри A вызывалась глобальная ::Func1, то теперь, поиск "не видит" глоальной.
Это, прям, какое-то ноу-хау от метаквот по борьбе с программистами на мкл.
Казалось бы, методы имеют разную сигнатуру, но нет - "не видит".
 
Ilyas #:

Будет оператор using, который решит проблему ограничения функционала (сделает поведение компилятора "как раньше")

И для базового скопа с шаблонами можно будет использовать using?

 
fxsaber #:

И для базового скопа с шаблонами можно будет использовать using?

Нет

Объявите в классе шаблонный метод с нужным именем, который выполняет проброс вызова в глобальную функцию, компилятор такие микро-функции успешно инлайнит.

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

Ужесточение правил резолвинга имени "стандартизирует" код.

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

 
Ilyas #:
При написании кода, нужно внедрять в сознание мысль - код пишется для чтения абстрактным читателем, а не тобой (а через 2+ года и свой код читается как чужой).

а никто не хочет внедрить в сознание мысль что через 2 года, прежний код всё-так-же должен компилироваться и работать..

???

 
Maxim Kuznetsov #:

а никто не хочет внедрить в сознание мысль что через 2 года, прежний код всё-так-же должен компилироваться и работать..

???


Очевидно же, что у MQ цель обратная.
 
Ilyas #:
свой код

Не могли бы ли вы ответить на вопрос, пожалуйста?

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

Ошибки, баги, вопросы

Vladislav Boyko, 2025.05.11 00:20

Сколько раз будет перерисован график если ChartRedraw() будет вызван 2 раза в пределах одного выполнения OnCalcualte()?

  • Единократная перерисовка после выполнения обработчика OnCalculate()?
  • Или каждый вызов ChartRedraw() приводит к немедленной перерисовке (и 2 вызова ChartRedraw() в рамках выполнения одного OnCalculate() перерисуют график 2 раза)?

OnCalculate там упомянут для примера и символизирует любую event handling function

 
Ilyas #:

Объявите в классе шаблонный метод с нужным именем, который выполняет проброс вызова в глобальную функцию, компилятор такие микро-функции успешно инлайнит.

Спасибо.

Ужесточение правил резолвинга имени "стандартизирует" код.

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

Согласен. Но в MQL5 иногда приходилось писать гадкие костыли, чтобы обойти ограничения языка. Например, предложенный Вами проброс, но в обратном направлении. Это нужно для обхода ограничения указателей на функции: нельзя сделать указатель на статический метод.


Чтобы не быть голословным, библиотека TypeToBytes компилировалась без предупреждений. Сейчас - черт ногу сломит.

TypeToBytes
TypeToBytes
  • 2016.09.13
  • www.mql5.com
Побайтовая работа со структурами, массивами и стандартными типами данных