Вернуть 2 переменные - нельзя.
Но можно, например, объявить a и b вне функций (на глобальном уровне), а из вызываемой функции (xyFunc) присваивать им необходимые значения ;)
Но можно, например, объявить a и b вне функций (на глобальном уровне), а из вызываемой функции (xyFunc) присваивать им необходимые значения ;)
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>; } }
Кроме глобальных переменных можно ещё использовать передачу переменных по ссылке, а не по значению
Кстати говоря самый удобный способ особенно в большой программе! Я именно им постоянно и пользуюсь.
ну и можно, конечно, возвращать строку, в которой через разделитель какой нибудь возвращать значения, а в вызывающей процедуре разделять строку на значения и преобразовывать в числовые.
:)
:)
Спасибо вам ребята! Столько разных способов. Считаю void Func(double a, double b, double& x, double& y) самым удобным для меня способом. А что означает & на конце double&?
А что означает & на конце double&?
То самое и означает - "передача параметра по ссылке". То есть при изменении этого параметра в вызываемой функции будет изменено само передаваемое в функцию значение этого параметра в основной программе. То есть будет именно так как вам и требуется.
ну и можно, конечно, возвращать строку, в которой через разделитель какой нибудь возвращать значения, а в вызывающей процедуре разделять строку на значения и преобразовывать в числовые.
:)
:)
Можно, но не эффективно. Да и зачем, если уже есть стандартные средства - передача по ссылке.
Кстати, надо отметить, что переменные, которые должны передаваться в функцию по ссылке должны быть объявлены или в вызывающей функции или на глобальном уровне. Т.е. нельзя передать в качестве параметра просто число или выражение.
Норфолк, конечно же, не эффективно, потому и смайлик стоит в конце...
Но иногда стоит воспользоваться именно таким способом, потому что, во-первых, использование глобальных переменных - плохой стиль программирования, это вам любой более-менее приличный програмер скажет, во-вторых, если планируется большое количество вызовов разных функций, возвращающих количество значений, более одного, приходится разводить большое количество глобальных переменных, что тоже неэффективно. В этом случае лучше пересмотреть алгоритм.
Ну и, наконец, можно использовать массивы, правда, тоже глобальные :)
Наконец, неплохо просто знать еще и о таком способе - больше выбор, легче выбрать наиболее оптимальное решение. Или сложнее :)
Идеально использовать объекты, инкапсулирующие в себе свои свойства и методы, но их нет в MQL. Хотя и с объектами есть проблемы - сложнее программирование, и ресурсы требуются больше, падает скорость выполнения и т.д. В общем, нет совершенства :)
Но иногда стоит воспользоваться именно таким способом, потому что, во-первых, использование глобальных переменных - плохой стиль программирования, это вам любой более-менее приличный програмер скажет, во-вторых, если планируется большое количество вызовов разных функций, возвращающих количество значений, более одного, приходится разводить большое количество глобальных переменных, что тоже неэффективно. В этом случае лучше пересмотреть алгоритм.
Ну и, наконец, можно использовать массивы, правда, тоже глобальные :)
Наконец, неплохо просто знать еще и о таком способе - больше выбор, легче выбрать наиболее оптимальное решение. Или сложнее :)
Идеально использовать объекты, инкапсулирующие в себе свои свойства и методы, но их нет в MQL. Хотя и с объектами есть проблемы - сложнее программирование, и ресурсы требуются больше, падает скорость выполнения и т.д. В общем, нет совершенства :)
Уважаемые разработчики МТ, пожалуйста повторите информацию о передаче параметров по ссылке отсюда
"MQL4: Формальные параметры"
здесь
"MQL4: Функции"
Повторение, как говорится, мать учения. МТ и его его язык MQL4 имеют очень широкие возможности. Но только эти возможности либо плохо объяснены, либо объяснены не в том месте. Например, страница о переменных
"MQL4: Переменные"
содержит информацию об внешних функциях, которую я кстати тоже искал. А страница о функциях
"MQL4: Функции"
не содержит информацию об внешних функциях. Может большинство программистов умнее меня и будут искать информацию об внешних функциях на странице о переменных. Но для таких приземлённых как я, не плохо бы иметь эту информацию под разделом к которому она больше относится или хотя бы добавить ссылку на все страницы где упоминаются функции (например, внизу можно указать "смотри также здесь, здесь и здесь"). Это не критика, а скорее совет по улучшению документации. Я понимаю что у вас есть более неотложные задачи по усовершенствования платформы. Но пожалуйста не забывайте что её пользователям также нужно иметь хорошую документацию по её использованию.
С уважением, Владимир.
"MQL4: Формальные параметры"
здесь
"MQL4: Функции"
Повторение, как говорится, мать учения. МТ и его его язык MQL4 имеют очень широкие возможности. Но только эти возможности либо плохо объяснены, либо объяснены не в том месте. Например, страница о переменных
"MQL4: Переменные"
содержит информацию об внешних функциях, которую я кстати тоже искал. А страница о функциях
"MQL4: Функции"
не содержит информацию об внешних функциях. Может большинство программистов умнее меня и будут искать информацию об внешних функциях на странице о переменных. Но для таких приземлённых как я, не плохо бы иметь эту информацию под разделом к которому она больше относится или хотя бы добавить ссылку на все страницы где упоминаются функции (например, внизу можно указать "смотри также здесь, здесь и здесь"). Это не критика, а скорее совет по улучшению документации. Я понимаю что у вас есть более неотложные задачи по усовершенствования платформы. Но пожалуйста не забывайте что её пользователям также нужно иметь хорошую документацию по её использованию.
С уважением, Владимир.
Но иногда стоит воспользоваться именно таким способом, потому что, во-первых, использование глобальных переменных - плохой стиль программирования, это вам любой более-менее приличный програмер скажет, во-вторых, если планируется большое количество вызовов разных функций, возвращающих количество значений, более одного, приходится разводить большое количество глобальных переменных, что тоже неэффективно. В этом случае лучше пересмотреть алгоритм.
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 используются на том уровне, на котором требуется разработчику.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
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.