Почему объявление параметра функции как void дает ошибку в MQL5? - страница 4

 
jaffer wilson:

Это ошибка, когда я пробовал ваш пример:

Можете ли вы сказать мне, какую сборку вы используете? Я использую это


Вы спрашивали: " Не могли бы вы поделиться со мной работоспособным скриптом MQL4?" А показываете окно из МТ5.

 
Dmitry Fedoseev :

Вы спрашивали: "  Не могли бы вы поделиться со мной работоспособным скриптом MQL4? " А показываете окно из МТ5.

Мне действительно очень жаль. Я предполагал написать MQL5, но я написал MQL4.

Подскажите, пожалуйста, рабочий пример для MQL5? Это поможет. Собственно вопрос по MQL5. Я пытаюсь преобразовать несколько массивов из MQL4 в MQL5. Но они многомерны. Следовательно, у меня был этот запрос.

Я надеюсь, что вы можете мне помочь.

 
jaffer wilson:

Мне действительно очень жаль. Я предполагал написать MQL5, но я написал MQL4.

Подскажите, пожалуйста, рабочий пример для MQL5? Это поможет. Собственно вопрос по MQL5. Я пытаюсь преобразовать несколько массивов из MQL4 в MQL5. Но они многомерны. Следовательно, у меня был этот запрос.

Я надеюсь, что вы можете мне помочь.

Со стандартными массивами не получится пока. Только как-нибудь с помощью ООП, если такое понравится.

 
Dmitry Fedoseev :

Со стандартными массивами не получится пока. Только как-нибудь с помощью ООП, если такое понравится.

Конечно. Я хотел бы увидеть пример с ООП. Но это должно быть что-то, что я могу назвать решением.
 
jaffer wilson:
Конечно. Я хотел бы увидеть пример с ООП. Но это должно быть что-то, что я могу назвать решением.

В стандартной библиотеке есть класс CArrayObj, каждому элементу массива, созданного этим классом, можно присваивать другой объект класса CArrayObj, CArrayDouble, CArrayInt и т.п.

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

То есть задача как бы давно решена. Но на сколько это удобно? 

 
jaffer wilson:

Это ошибка, когда я пробовал ваш пример:

'arraycheck.mq5'        arraycheck.mq5  1       1
'[' - invalid index value       arraycheck.mq5  65      19
'[' - invalid index value       arraycheck.mq5  70      19
'[' - invalid index value       arraycheck.mq5  70      22
'[' - invalid index value       arraycheck.mq5  75      19
'[' - invalid index value       arraycheck.mq5  75      22
'[' - invalid index value       arraycheck.mq5  75      25
'f' - no one of the overloads can be applied to the function call       arraycheck.mq5  52      4
could be one of 4 function(s)   arraycheck.mq5  52      4
   void f(T&[]) arraycheck.mq5  60      7
   void f(T&[][1])      arraycheck.mq5  65      7
   void f(T&[][1][1])   arraycheck.mq5  70      7
   void f(T&[][1][1][1])        arraycheck.mq5  75      7
'f' - no one of the overloads can be applied to the function call       arraycheck.mq5  55      4
could be one of 4 function(s)   arraycheck.mq5  55      4
   void f(T&[]) arraycheck.mq5  60      7
   void f(T&[][1])      arraycheck.mq5  65      7
   void f(T&[][1][1])   arraycheck.mq5  70      7
   void f(T&[][1][1][1])        arraycheck.mq5  75      7
8 errors, 0 warnings            9       1

Можете ли вы сказать мне, какую сборку вы используете? Я использую это

Я внёс необходимые изменения в MQL5 компилятор, в следующем билде MT5 (начиная с 2743) код будет компилироваться без ошибок

 

О, уже интереснее, спасибо!

Build 2744.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double dArr2[][3] = {{1., 2., 3.}, {4., 5., 6.}};
   int size = ::ArraySize(dArr2);
   ::PrintFormat("\ndouble array initial size: %d", size);
   f<double>(dArr2);
   //---
   short sArr2[][2] = {{1, 2}, {3, 4}, {5, 6}};
   size = ::ArraySize(sArr2);
   ::PrintFormat("\nshort array initial size: %d", size);
   f<short>(sArr2);
   //---
   char cArr2[][4] = {{1, 2, 3, 4}, { 5, 6, 7, 8}};
   size = ::ArraySize(cArr2);
   ::PrintFormat("\nchar array initial size: %d", size);
   f<char>(cArr2);
  }
//+------------------------------------------------------------------+
//| Two-dimensional array                                            |
//+------------------------------------------------------------------+
template <typename T>
void f(T & x[][])
  {
   string type_str = typename(T);
   int arr_size = ::ArraySize(x);
   ::PrintFormat("   %s array size: %d", type_str, arr_size);
   for(int dim = 0; dim < 2; dim++)
     {
      ::PrintFormat("   Array range in an array dimension %d: %d", dim, ::ArrayRange(x, dim));
     }
  }
//+------------------------------------------------------------------+


Лог:

2021.01.12 19:27:15.271 test_arrays (EURUSD,H1) double array initial size: 6
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    double array size: 0
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    Array range in an array dimension 0: 2
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    Array range in an array dimension 1: 3
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1) 
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1) short array initial size: 6
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    short array size: 0
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    Array range in an array dimension 0: 3
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    Array range in an array dimension 1: 2
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1) 
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1) char array initial size: 8
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    char array size: 0
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    Array range in an array dimension 0: 2
2021.01.12 19:27:15.271 test_arrays (EURUSD,H1)    Array range in an array dimension 1: 4

Вопрос.

Почему внутри функции f()  штатная функция ::ArraySize() возвращает 0


ЗЫ. Рисунок не вставляется, загрузил прицепом. В Отладчике видно, что массив "х" относится к fixed array. Это что за новая сущность?

Файлы:
array_debug.png  35 kb
 
Denis Kirichenko:

Возможно, связано

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

Новая версия платформы MetaTrader 5 build 2715: Общие улучшения

Edgar Akhmadeev, 2021.01.12 17:47

Крутой баг в дебаггере. И это не тавтология.

Код:

struct t {
        string  s1;
        string  s2;
};



const t s[] = {
        { "",   "1" },
        { "",   "2" }
};



void
OnStart() {
        string b = "";
        for (int i = ArraySize(s) - 1; i >= 0; --i) {
                Print(i);
                if (s[i].s2 != b) {
                        Print(i);
                        continue;
                }
                
                break;
        }
}

В билде 2741 нормальное поведение (в релизе и дебаге):

2021.01.12 19:44:42.530 t (EURUSD,M1)   1
2021.01.12 19:44:42.530 t (EURUSD,M1)   1
2021.01.12 19:44:42.530 t (EURUSD,M1)   0
2021.01.12 19:44:42.530 t (EURUSD,M1)   0


В билдах 2743, 2744  (только в дебаге):

2021.01.12 19:46:25.355 t (EURUSD,H1)   1
2021.01.12 19:46:25.357 t (EURUSD,H1)   24
2021.01.12 19:46:25.357 t (EURUSD,H1)   23
2021.01.12 19:46:25.357 Message Critical error while running script 't (EURUSD,H1)'.
2021.01.12 19:46:25.357 Message Array out of range.

 
Denis Kirichenko:

О, уже интереснее, спасибо!

Build 2744.


Лог:

Вопрос.

Почему внутри функции f()  штатная функция ::ArraySize() возвращает 0


ЗЫ. Рисунок не вставляется, загрузил прицепом. В Отладчике видно, что массив "х" относится к fixed array. Это что за новая сущность?

Спасибо за сообщение!

Исправлено

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