Скачать MetaTrader 5

Как создать функцию возвращающую два значения?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114297
Forex Trader  
В моём коде есть кусок, который повторяется много раз. Что-то в слдующем роде

double a=1.;
double b=2.;
for(int i=0;i<=Bars-1;i++)
{
<вычисляем x как функцию a и b>;
<вычисляем y как функцию a и b>;
}

Как можно создать функцию, которая возвращала бы x и y? То есть как объединить следующие две функции в одну

double xFunc (double a, double b).;
{
for(int i=0;i<=Bars-1;i++)<вычисляем x как функцию a и b>;
return(x)
}

double yFunc (double a, double b).;
{
for(int i=0;i<=Bars-1;i++)<вычисляем y как функцию a и b>;
return(y)
}

Неплохо если бы MQL4 имел subroutines.
Forex Trader
114297
Forex Trader  
Вернуть 2 переменные - нельзя.
Но можно, например, объявить a и b вне функций (на глобальном уровне), а из вызываемой функции (xyFunc) присваивать им необходимые значения ;)
Forex Trader
114297
Forex Trader  
to gpwr
Кроме глобальных переменных можно ещё использовать передачу переменных по ссылке, а не по значению
double a=1.;
double b=2.;
for(int i=0;i<=Bars-1;i++)
{
  double x, y;
  Func(a, b, x, y);
}

void Func(double a, double b, double& x, double& y);
{
  for(int i=0;i<=Bars-1;i++)
  {
    <вычисляем x как функцию a и b>;
    <вычисляем y как функцию a и b>;
  }
}
Forex Trader
114297
Forex Trader  
Кроме глобальных переменных можно ещё использовать передачу переменных по ссылке, а не по значению

Кстати говоря самый удобный способ особенно в большой программе! Я именно им постоянно и пользуюсь.
Forex Trader
114297
Forex Trader  
ну и можно, конечно, возвращать строку, в которой через разделитель какой нибудь возвращать значения, а в вызывающей процедуре разделять строку на значения и преобразовывать в числовые.
:)
Forex Trader
114297
Forex Trader  
Спасибо вам ребята! Столько разных способов. Считаю void Func(double a, double b, double& x, double& y) самым удобным для меня способом. А что означает & на конце double&?
Forex Trader
114297
Forex Trader  
А что означает & на конце double&?

То самое и означает - "передача параметра по ссылке". То есть при изменении этого параметра в вызываемой функции будет изменено само передаваемое в функцию значение этого параметра в основной программе. То есть будет именно так как вам и требуется.
Forex Trader
114297
Forex Trader  
ну и можно, конечно, возвращать строку, в которой через разделитель какой нибудь возвращать значения, а в вызывающей процедуре разделять строку на значения и преобразовывать в числовые.
:)

Можно, но не эффективно. Да и зачем, если уже есть стандартные средства - передача по ссылке.

Кстати, надо отметить, что переменные, которые должны передаваться в функцию по ссылке должны быть объявлены или в вызывающей функции или на глобальном уровне. Т.е. нельзя передать в качестве параметра просто число или выражение.
Forex Trader
114297
Forex Trader  
Норфолк, конечно же, не эффективно, потому и смайлик стоит в конце...

Но иногда стоит воспользоваться именно таким способом, потому что, во-первых, использование глобальных переменных - плохой стиль программирования, это вам любой более-менее приличный програмер скажет, во-вторых, если планируется большое количество вызовов разных функций, возвращающих количество значений, более одного, приходится разводить большое количество глобальных переменных, что тоже неэффективно. В этом случае лучше пересмотреть алгоритм.
Ну и, наконец, можно использовать массивы, правда, тоже глобальные :)
Наконец, неплохо просто знать еще и о таком способе - больше выбор, легче выбрать наиболее оптимальное решение. Или сложнее :)
Идеально использовать объекты, инкапсулирующие в себе свои свойства и методы, но их нет в MQL. Хотя и с объектами есть проблемы - сложнее программирование, и ресурсы требуются больше, падает скорость выполнения и т.д. В общем, нет совершенства :)
Forex Trader
114297
Forex Trader  
Уважаемые разработчики МТ, пожалуйста повторите информацию о передаче параметров по ссылке отсюда

"MQL4: Формальные параметры"

здесь

"MQL4: Функции"

Повторение, как говорится, мать учения. МТ и его его язык MQL4 имеют очень широкие возможности. Но только эти возможности либо плохо объяснены, либо объяснены не в том месте. Например, страница о переменных

"MQL4: Переменные"

содержит информацию об внешних функциях, которую я кстати тоже искал. А страница о функциях

"MQL4: Функции"

не содержит информацию об внешних функциях. Может большинство программистов умнее меня и будут искать информацию об внешних функциях на странице о переменных. Но для таких приземлённых как я, не плохо бы иметь эту информацию под разделом к которому она больше относится или хотя бы добавить ссылку на все страницы где упоминаются функции (например, внизу можно указать "смотри также здесь, здесь и здесь"). Это не критика, а скорее совет по улучшению документации. Я понимаю что у вас есть более неотложные задачи по усовершенствования платформы. Но пожалуйста не забывайте что её пользователям также нужно иметь хорошую документацию по её использованию.

С уважением, Владимир.
Forex Trader
114297
Forex Trader  
Но иногда стоит воспользоваться именно таким способом, потому что, во-первых, использование глобальных переменных - плохой стиль программирования, это вам любой более-менее приличный програмер скажет, во-вторых, если планируется большое количество вызовов разных функций, возвращающих количество значений, более одного, приходится разводить большое количество глобальных переменных, что тоже неэффективно. В этом случае лучше пересмотреть алгоритм.

falkov, а я не говрил что надо использовать глобальные переменные. Я ещё было написано, что можно использовать переменные определённые вызывающей функции. А это уже не глобальный уровень. И как профессиональный программист, я Вам могу сказать, что это оптимальный вариант.
В качестве примера можно привести следующий код ():
bool GetPrices(string symbol, double &bid, double &ask)
{
  bid = MarketInfo(symbol, MODE_BID);
  ask = MarketInfo(symbol, MODE_ASK);
  int err = GetLastError();
  Print(err);
  return (err == 0);
}

int start()
{
  double ask1, bid1;
  bool bGood = GetPrices("EURUSD", ask1, bid1);
}


Т.е. в данном коде есть функция GetPrices, которая возвращает 3 значения:
- значение типа bool - через return;
- 2 значения типа double - через параметры-ссылки.
Причем никакого нарушения стиля программирования здесь нет. Переменные ask1 и bid1 используются на том уровне, на котором требуется разработчику.

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