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

 

Ещё одна проблема с .NET в новых билдах. Перестал видеть члены структур библиотеки.

C#:

public struct A { public int a; }

MQL:

A obj;
int a= obj.a; // 'a' - undeclared identifier
При том что подсказка с именем "a" в Метаэдиторе появляется.
 

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

C#

public struct A { int a; }

public class Program
{
  public static void F(A[] array) { }
}

MQL

A arr[];
Program::F(arr);

Лог экспертов:

System.IndexOutOfRangeException: Индекс находился вне границ массива.
в System.Array.InternalGetReference(Void* elemRef, Int32 rank, Int32* pIndices)
в System.Array.SetValue(Object value, Int32[] indices)
в Wrapper.ConverterArray.GetValueArray(IntPtr source, Object& destination)
в Wrapper.Converter.ArrayInitialize(IntPtr source, Object& destination, Int32 index)
в Wrapper.Converter.GetArray(IntPtr source, Object& destination)
в Wrapper.Wrapper.Call(MethodInfo method, Int64 owner, Int64 parameters, Int64 result)
.Net runtime error

Объявление аргумента как ref или out не влияет на ситуацию.

Проблема устраняется только если предварительно сделать размер массива не равным нулю:  ArrayResize(arr, 1);

При передаче массивов штатных типов (int, double, …) такой проблемы не возникает.

 

проблема актуальна если что:

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

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

Vladislav Andruschenko, 2019.08.07 11:38

нашел такой баг.

Не загружается Шаблон в тестере стратегий через меню Charts - Templates


если выбрать из списка, то не работает.

а если нажать на Load Template и выбрать файл - то все ОКЕ.




билд



и еще нет списка индикаторов, если индикаторы были загружены через шаблон:



 

билд 2133

в метаедиторе (при перезапуске) постоянно открываются вкладки проектов из облака, хотя их перед этим закрываю


 

В Терминале в окне Навигатор можно через меню правой кнопки перейти к исходнику нужной программы.


Но этот переход совсем не работает, если последняя компиляция была неудачной.

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

 

При правке кислотного цвета сброса фокуса что-то намудрили.


В данном случае при сбросе фокуса фоновый зеленый цвет исчезает.

 

В билде 2136 сломали typename()

Прошу починить обратно.

enum eTest
  {
   TEST
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(typename(eTest)); // eTest::eTest а правильно (и раньше так было) eTest
//---
   return(INIT_SUCCEEDED);
  }

typename

 

Можете все-таки пояснить, почему в этом коде теперь предупреждение?

Методы имеют разные сигнатуры...

class A
  {
   public:
                     A(void) {}
                    ~A(void) {}
      //===============
      void           Test(void) {}
      //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+  
class B : public A
  {
   public:
                     B(void) {}
                    ~B (void) {}
      //===============
      void           Test(int a) {}
      //===============
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   B b;

   b.Test(); //deprecated behavior, hidden method calling will be disabled in a future MQL compiler versions
   b.Test(5);
//---
   return(INIT_SUCCEEDED);
  }
 
Andrey Barinov:

Можете все-таки пояснить, почему в этом коде теперь предупреждение?

Методы имеют разные сигнатуры...

ИМХО, но логично же, что создав объект класса B вы обращаетесь к методу, который переопределён в этом классе относительно родителя. И поэтому он не должен быть пустым. Отсюда и предупреждение. Удивлён, что вообще не ошибка. :) Впрочем, можете смело наплевать на мой комментарий, поскольку я не профи-программист, а самоучка.

 
BlackTomcat:

ИМХО, но логично же, что создав объект класса B вы обращаетесь к методу, который переопределён в этом классе относительно родителя. И поэтому он не должен быть пустым. Отсюда и предупреждение. Удивлён, что вообще не ошибка. :) Впрочем, можете смело наплевать на мой комментарий, поскольку я не профи-программист, а самоучка.

№1. Метод не переопределен, а перегружен.

№2. Ни один из этих методов не пустой.

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