Скачать MetaTrader 5

Нужен хэлп по массивам

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Anton Pavlov
1112
Anton Pavlov  

Доброго времени суток!

Интересует вопрос: можно ли средствами MQL в результат функции возвратить массив? 

double GetAttay(int input 1, int input 2 ... int input N){

double ArrayOutput[][2];

return (ArrayOutput); 

 

Что нибудь похожее на это...

Vitalii Ananev
9455
Vitalii Ananev  
Anton Pavlov:

Доброго времени суток!

Интересует вопрос: можно ли средствами MQL в результат функции возвратить массив? 

double GetAttay(int input 1, int input 2 ... int input N){

double ArrayOutput[][2];

return (ArrayOutput); 

 

Что нибудь похожее на это...

Нет, только так: void GetAttay(int input 1, int input 2 ... int input N, double &ArrayOutput[])

{........}

Ihor Herasko
12035
Ihor Herasko  

Можно, если обернуть массив в структуру, но при условии, что массив статический:

struct MyArray
{
   double array[5][2];  
};


MyArray GetArray()
{
   MyArray funcStruct;
   return funcStruct;
}

Хотя такой подход нельзя считать хорошим - происходит передача массива по значению. С массивами лучше использовать ссылки:

void GetArray(double &array[], double input1, ..., double inputN)
{
   array[0] = input1;
   ...
   array[N - 1] = inputN;
}
Anton Pavlov
1112
Anton Pavlov  
Ihor Herasko:

Можно, если обернуть массив в структуру, но при условии, что массив статический:

Хотя такой подход нельзя считать хорошим - происходит передача массива по значению. С массивами лучше использовать ссылки:

структуры точно нет.
Anton Pavlov
1112
Anton Pavlov  
Vitalii Ananev:

Нет, только так: void GetAttay(int input 1, int input 2 ... int input N, double &ArrayOutput[])

{........}

"на нет и суда нет") Спасибо.
Vitalii Ananev
9455
Vitalii Ananev  
Anton Pavlov:
"на нет и суда нет") Спасибо.

Массив нельзя вернуть как результат функции c помощью return. Но можно предать по ссылке в качестве параметра функции массив. 

Пример: 

void arr(double &Array[]) 
{
  //тут заполняем массив Array[] данными
  for(i=0;i<=ArraySize(Array)-1;i++) Array[i]=i;
}

void OnTick()
{
   double Arr[5];
   arr(Arr);
   ...
   //
   for (i=0;i<=ArraySize(Arr)-1;i++) Print(Arr[i]);
   

}
Anton Pavlov
1112
Anton Pavlov  
Vitalii Ananev:

Массив нельзя вернуть как результат функции c помощью return. Но можно предать по ссылке в качестве параметра функции массив. 

Пример: 

Это я понял. И мне это вполне подойдет)
Alexey Viktorov
12455
Alexey Viktorov  
Anton Pavlov:
Это я понял. И мне это вполне подойдет)
Ещё можно объявить массив на уровне глобальных переменных и обращаться к нему из любой функции программы.
George Merts
4336
George Merts  

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

Единственное исключение - это функция-фабрика объектов. По сути, расширенный вариант оператора new. При этом надо помнить, что созданные объекты необходимо удалять после использования.

В случае массивов, как мне кажется, следует сперва массив создать, а потом отдельной функцей - заполнить его. При этом, как мне кажется, правильнее обернуть массив в класс (чаще всего - достаточно использовать готовые из стандартной библиотеки), а в функцию просто передавать указатель на созданный объект. Функция его заполняет, и возвращает признак ошибки (или ее отсутствия).

Статические переменные класса - по-моему, тоже следует применять с осторожностью. Главная область их применения - это значения или величины, нужные всем экземплярам класса.

Anton Pavlov
1112
Anton Pavlov  
George Merts:

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

Единственное исключение - это функция-фабрика объектов. По сути, расширенный вариант оператора new. При этом надо помнить, что созданные объекты необходимо удалять после использования.

В случае массивов, как мне кажется, следует сперва массив создать, а потом отдельной функцей - заполнить его. При этом, как мне кажется, правильнее обернуть массив в класс (чаще всего - достаточно использовать готовые из стандартной библиотеки), а в функцию просто передавать указатель на созданный объект. Функция его заполняет, и возвращает признак ошибки (или ее отсутствия).

Статические переменные класса - по-моему, тоже следует применять с осторожностью. Главная область их применения - это значения или величины, нужные всем экземплярам класса.

Уххх... Для непрограммиста это понять сложно) как прочитал мини-лекцию) а я думал массив это простой объект)
Victor Nikolaev
Модератор
15182
Victor Nikolaev  
Anton Pavlov:
Уххх... Для непрограммиста это понять сложно) как прочитал мини-лекцию) а я думал массив это простой объект)
Любой объект может быть сложным или простым. Как к этому подходить. Можно усложнять, можно упрощать. Все зависит от человека
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий