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

 
jaffer wilson:

Это не сработало.

Ошибка:

Ошибка, это обычное дело... Надо исправлять. И мне отсюда не видать, что вы там делаете, может вы не то делаете. Должно получиться четыре разных функции с одинаковыми именами, но у параметра функции разное количество измерений массива. Это не может не сработать.

 
Dmitry Fedoseev:

Используйте перегрузку. Максимальное количество измерений массива - 4. Значит надо написать всего четыре варианта функции:

template <typename T>
void f(T& x[]){

}

template <typename T>
void f(T& x[][]){

}

template <typename T>
void f(T& x[][][]){

}

template <typename T>
void f(T& x[][][][]){

}

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

Разве? А вот тут автор пишет, что:

При передаче многомерных массивов в функцию необходимо указывать размеры измерений кроме первого:

double var[][3][3];

void Func(double &arg[][3][3]){
   // ...
}

Или Вы с ним не согласны? :-)

Или может я что-то не так понял?

Основы программирования на MQL5 - Массивы
Основы программирования на MQL5 - Массивы
  • www.mql5.com
Наряду с переменными и функциями, массивы являются практически неотъемлемой частью любого языка программирования. Статья должна быть интересна в первую очередь новичкам, приступившим к изучению программирования на MQL5. Опытным программистам представляется хорошая возможность подытожить, обобщить и систематизировать свои знания.
 
Denis Kirichenko:

Разве? А вот тут автор пишет, что:

Или Вы с ним не согласны? :-)

Или может я что-то не так понял?

Не тот редактор под рукой оказался. Есть разница в 4 и 5. В 4 компилируется без указания размера измерений, а в 5 - надо указывать.

Ну и значит миссия не выполнима. Как же много граблей здесь разложено! Их что, специально здесь раскладывают?

 
Vitaly Muzichenko:

mql4 будет поддерживать это обновление, код можно будет делать кроссплатформенным?

Нет.

 
Dmitry Fedoseev :

Ошибка, это обычное дело... Надо исправлять. И мне отсюда не видать, что вы там делаете, может вы не то делаете. Должно получиться четыре разных функции с одинаковыми именами, но у параметра функции разное количество измерений массива. Это не может не сработать.

Позвольте мне показать вам, что я сделал.

Вот код:

void OnStart()
  {
   int a[][2] = {{3,1}, {5,3}, {1,3}, {7,4}, {9,2}, {2,4}, {7,2}, {0,1}, {4,1}, {16,1}};
   ArraySort(a);
   ArrayPrint(a);
   ArrayOperation(a);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
void ArrayOperation(T &array[][2])
  {

  }
  
  template < typename T>
 void f (T & x []) {

}

template < typename T>
 void f (T & x [] []) {

}

template < typename T>
 void f (T & x [] [] []) {

}

template < typename T>
 void f (T & x [] [] [] []) {

}
//+------------------------------------------------------------------+

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

 
jaffer wilson:

Позвольте мне показать вам, что я сделал.

Вот код:

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

Ошибка исправляется указанием конкретного размера для второго измерения (и для третьего, четвертого). Но в этом случае функция перестает быть универсальной. Вы написали:

void ArrayOperation(T &array[][2])
  {

  }

В эту функцию можно передать только такой массив:

int a[][2]

А с другим размером второго измерения - нет. Вот такой уже не получится:

int a[][3]
 
Vitaly Muzichenko:

mql4 будет поддерживать это обновление, код можно будет делать кроссплатформенным?

Нет, MQL4 больше не развивается.
 
Dmitry Fedoseev :

Ошибка исправляется указанием конкретного размера для второго измерения (и для третьего, четвертого). Но в этом случае функция перестает быть универсальной. Вы написали:

В эту функцию можно передать только такой массив:

А с другим размером второго измерения - нет. Вот такой уже не получится:

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

 
jaffer wilson:

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

void OnStart(){

   int z[][2];
   f(z);
   
   int z2[][3];
   f(z2);   

}

template <typename T>
void f(T& x[]){
   Alert("1: ",ArrayRange(x,0));
}

template <typename T>
void f(T& x[][]){
   Alert("2: ",ArrayRange(x,0)," ",ArrayRange(x,1)," ",ArrayDimension(x));
}

template <typename T>
void f(T& x[][][]){
   Alert("3: ",ArrayRange(x,0)," ",ArrayRange(x,1)," ",ArrayRange(x,2));
}

template <typename T>
void f(T& x[][][][]){
   Alert("4: ",ArrayRange(x,0)," ",ArrayRange(x,1)," ",ArrayRange(x,2)," ",ArrayRange(x,3));
}
 
Dmitry Fedoseev :

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

'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

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


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