Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Есть возможность протестировать программу перед покупкой. Узнай как!
Alexandr Balasyan
501
Alexandr Balasyan 2014.11.09 08:03 

 Всем привет! Как вернуть массив в функции? 

Не видел такого примера в учебнике, интуитивно пытался разные варианты проделать наподобие этого: 

 double[] Test() {

 double A[3] = {0, 1, 2} ;

        return (A);

}       

Но не получилось )

Alexey Viktorov
5175
Alexey Viktorov 2014.11.09 08:13  
Ortex:

 Всем привет! Как вернуть массив в функции? 

Не видел такого примера в учебнике, интуитивно пытался разные варианты проделать наподобие этого: 

 double[] Test() {

}       

Но не получилось )

Можно только передать в функцию по ссылке массив который будет изменён

double A[3] = {1, 2, 3};
test(A);

void test(double &B)
{
   for(int i = 0; i < ArraySize(B); i++)
    B[i] += 2;
}
В результате получишь массив А со значениями 3, 4, 5
Alexandr Balasyan
501
Alexandr Balasyan 2014.11.09 08:15  
ааа. Жаль, но хоть так. Спасибо!
Alexey Viktorov
5175
Alexey Viktorov 2014.11.09 08:21  
Ortex:
ааа. Жаль, но хоть так. Спасибо!
Ну ещё вариант, массив объявить на уровне глобальных переменных и в функции делай с ним что хочешь, после выхода из функции массив останется изменён.
Alexandr Balasyan
501
Alexandr Balasyan 2014.11.09 08:41  
Еще такой вопрос возникает. Вот я для удобства захотел сделать функцию ArrayPush, для добавления нового элемента в массив. И не понятно как мне объявить аргумент массива, если я заранее не знаю его тип? Это значит не судьба такую функцию сделать?
Alexey Viktorov
5175
Alexey Viktorov 2014.11.09 14:59  
Ortex:
Еще такой вопрос возникает. Вот я для удобства захотел сделать функцию ArrayPush, для добавления нового элемента в массив. И не понятно как мне объявить аргумент массива, если я заранее не знаю его тип? Это значит не судьба такую функцию сделать?
Изучай классы. На сайте есть статья об этом и в ней есть такой пример.
Простак
315
Простак 2014.11.09 19:28  
Ortex:
Еще такой вопрос возникает. Вот я для удобства захотел сделать функцию ArrayPush, для добавления нового элемента в массив. И не понятно как мне объявить аргумент массива, если я заранее не знаю его тип? Это значит не судьба такую функцию сделать?

В MQL4++ есть шаблоны функций:

#property strict

/******************************************************************************/
template <typename T>
void print(const T &array[]) {
  const int size = ArraySize(array);

  Print("array size = ", size);

  for (int i = 0; i < size; i++) {
    Print("array[", i, "] = ", array[i]);
  }
}

/******************************************************************************/
template <typename T>
bool ArrayPush(T &array[], const T item) {
  const int size = ArraySize(array);

  if (ArrayResize(array, size + 1) != size + 1) {
    return false;
  }

  array[size] = item;
  return true;
}

/******************************************************************************/
void OnStart( void ) {
  int a1[3] = {2, 3, 4};
  double a2[3] = {1, 2, 2.71828};

  print(a1);
  print(a2);

  if (!ArrayPush(a1, 7)) {
    Print("Не удалось выполнить ArrayPush!");
  }

  if (!ArrayPush(a2, 3.14159)) {
    Print("Не удалось выполнить ArrayPush!");
  }

  print(a1);
  print(a2);
}

Результат:

Script 3 EURUSDm,H1: loaded successfully
3 EURUSDm,H1: initialized
3 EURUSDm,H1: array size = 3
3 EURUSDm,H1: array[0] = 2
3 EURUSDm,H1: array[1] = 3
3 EURUSDm,H1: array[2] = 4
3 EURUSDm,H1: array size = 3
3 EURUSDm,H1: array[0] = 1.0
3 EURUSDm,H1: array[1] = 2.0
3 EURUSDm,H1: array[2] = 2.71828
3 EURUSDm,H1: array size = 4
3 EURUSDm,H1: array[0] = 2
3 EURUSDm,H1: array[1] = 3
3 EURUSDm,H1: array[2] = 4
3 EURUSDm,H1: array[3] = 7
3 EURUSDm,H1: array size = 4
3 EURUSDm,H1: array[0] = 1.0
3 EURUSDm,H1: array[1] = 2.0
3 EURUSDm,H1: array[2] = 2.71828
3 EURUSDm,H1: array[3] = 3.14159
3 EURUSDm,H1: uninit reason 0
Script 3 EURUSDm,H1: removed

Напрямую массив вернуть нельзя, но, если сильно хочется, то - можно, правда, "накривую".

Массив можно обернуть классом, и тогда - можно, но в составе класса. Получается очень неуклюже и неудобно.

PS. На самом деле ArrayResize() может отработать неуспешно, и это надо проверять. Соответственно, ArrayPush() тоже может отработать неуспешно и это надо проверять в коде, который будет вызывать ArrayPush(). Сначала без проверок сделал, но так нельзя, иначе "array[size] = item;" неправомерно было бы исполнять, поэтому отяготил проверками.

Alexandr Balasyan
501
Alexandr Balasyan 2014.11.17 09:09  
Большое  спасибо, не знал что все это есть в mql4!
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий