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

 
fxsaber :

Проверить быстрее, чем задать вопрос.

Хорошо, я нашел это, когда попробовал:

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[])
  {

  }


'a' - преобразование параметров запрещено  arraycheck.mq5  17      19

Но такого никогда не происходит с функциями MQL5, тогда почему с функциями, определяемыми пользователем?

 
jaffer wilson:

Хорошо, я нашел это, когда попробовал:

Но такого никогда не происходит с функциями MQL5, тогда почему с функциями, определяемыми пользователем?

template <typename T>
void ArrayOperation(T &array[][2])
  {

  }

И да, не на массив у тебя ссылка, а на объект-обертку над массивом, прочитайте уже документацию вдумчиво, там все это есть.

 
Vladimir Simakov :

И да, не на массив у тебя ссылка, а на объект-обертку над массивом, прочитайте уже документацию вдумчиво, там все это есть.

Но это может быть временным решением. Если у меня второе измерение 2, 3, 5, 6, что мне делать? Вам не кажется, что предложенное вами решение неверно. Я уже пробовал, но мое требование - универсальная функция, а не временная. Вот почему я сказал, что встроенная функция MQL5 не имеет таких критериев, но пользовательская функция их имеет.

 
jaffer wilson:

Но это может быть временным решением. Если у меня второе измерение 2, 3, 5, 6, что мне делать?

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

2. Оборачивать массивы в классы, являющиеся производными общего базового класса и предавать в функцию ссылку с типом базового класса.

3. Жить проще. То есть решить стоящую задачу непосредственно, то есть без поиска универсального решения, которое вряд ли пригодится в будущем.

 
Dmitry Fedoseev :

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

2. Оборачивать массивы в классы, являющиеся производными общего базового класса и предавать в функцию ссылку с типом базового класса.

3. Жить проще. То есть решить стоящую задачу непосредственно, то есть без поиска универсального решения, которое вряд ли пригодится в будущем.

Это был пример. Я вообще-то не знаю, какой будет размер второго измерения. Пожалуйста, не могли бы вы помочь? Я не могу указать жестко закодированное значение во втором измерении. Вот почему мне нужна общая пользовательская функция для массива. И я буду им вечно пользоваться.

 
jaffer wilson:

Это был пример. Я вообще-то не знаю, какой будет размер второго измерения. Пожалуйста, не могли бы вы помочь? Я не могу указать жестко закодированное значение во втором измерении. Вот почему мне нужна общая пользовательская функция для массива. И я буду им вечно пользоваться.

Используйте перегрузку. Максимальное количество измерений массива - 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[][][][]){

}

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

 
jaffer wilson:

Но это может быть временным решением. Если у меня второе измерение 2, 3, 5, 6, что мне делать? Вам не кажется, что предложенное вами решение неверно. Я уже пробовал, но мое требование - универсальная функция, а не временная. Вот почему я сказал, что встроенная функция MQL5 не имеет таких критериев, но пользовательская функция их имеет.

Это уже а разрабам, заодно и про изобретенное ими void&. Ну не захотели они нормальную обертку про многомерный массив писать, так что, пользуемся тем, что дали))) Включай голову и решай через свои обертки) Там нет ничего принципиально сложного, что бы не сделать свой "многомерный массив". Вполне шустрый велосипед можно при желании изобразить)
 

Планируем разрешить объявление полноценных многомерных массивов

Примеры:

double a2[][];


template<typename T>
void func(T &a[][][])
  {
  }
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilyas:

Планируем разрешить объявление полноценных многомерных массивов

Примеры:

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

 
Dmitry Fedoseev :

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

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

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

Ошибка:

'arraycheck.mq5'        arraycheck.mq5  1       1
'[' - invalid index value       arraycheck.mq5  34      19
'[' - invalid index value       arraycheck.mq5  39      19
'[' - invalid index value       arraycheck.mq5  39      22
'[' - invalid index value       arraycheck.mq5  44      19
'[' - invalid index value       arraycheck.mq5  44      22
'[' - invalid index value       arraycheck.mq5  44      25