Передача параметров по ссылке

 
Попытался создать файл-инклюдник с "переопределением" стандартных функций. Споткнулся на первой же.
Вот такая фнукция через компилятор не проходит

//+------------------------------------------------------------------+
//| переопределение функции OrderSend()                              |
//+------------------------------------------------------------------+
int XOrderSend(string symbol, int cmd, double volume, double price, int slippage, 
               double stoploss, double takeprofit, string comment="", int magic=0,
               datetime expiration=0, color arrow_color=CLR_NONE, string ExpertName,
               int &err, string &errDescribe )
   {
     int ticket=-1;
   
     return(ticket);
   }

Компилятор выдает

',' - initialization expected C:\Program Files\MetaTrader 4\experts\include\XTradeLog. mqh (18, 218)
',' - initialization expected C:\Program Files\MetaTrader 4\experts\include\XTradeLog. mqh (18, 227)
')' - initialization expected C:\Program Files\MetaTrader 4\experts\include\XTradeLog. mqh (18, 249)
3 ошибок, 0 предупреждений


Прочитал справку, вроде убедиося, что действительно нельзя (и почему?)

Существует возможность передавать параметры по ссылке. В этом случае модификация таких параметров отразится на соответствующих переменных в вызываемой функции, переданных по ссылке. Параметры по ссылке можно передавать только в пределах одного модуля, для библиотечных функций такая возможность не предусмотрена. Для того чтобы указать, что параметр передается по ссылке, после типа данных необходимо поставить модификатор &.

Пример:

void func(int& x, double& y, double& z[])
{
double calculated_tp;
...
for(int i=0; i<OrdersTotal(); i++)
{
if(i==ArraySize(z)) break;
if(OrderSelect(i)==false) break;
z[i]=OrderOpenPrice();
}
x=i;
y=calculated_tp;
}


Перенес код в советника, ругается также. Тогда решил перенести три последних параметра в начало, ругаться перестал
//+------------------------------------------------------------------+
//| переопределение функции OrderSend()                              |
//+------------------------------------------------------------------+
int XOrderSend(string ExpertName,int &err, string &errDescribe, string symbol,
               int cmd, double volume, double price, int slippage, double stoploss,
               double takeprofit, string comment="", int magic=0, datetime expiration=0,
               color arrow_color=CLR_NONE)
   {
     int ticket=-1;
   
     return(ticket);
   }

Потом решил в таком же виде эту функцию снова определить в инклюднике - и компилятор не ругается!

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

<quote>

Передаваемые в функцию параметры являются локальными. Областью видимости является блок функции. Формальные параметры должны отличаться по именам от внешних переменных и локальных переменных, определенных внутри функции. В блоке функции формальным параметрам могут быть присвоены некоторые значения.

Пример:

void func(int x[], double y, bool z)
{
if(y>0.0 && !z)
Print(x[0]);
...
}

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

Пример:

void func(int x, double y = 0.0, bool z = true)
{
...
}

При вызове такой функции инициализированные параметры можно опускать, вместо них будут подставлены значения по умолчанию </quote>.

С другой стороны, параметры, передающиеся по ссылке, не могут быть проинициализованы. Я правильно понял, что самый первый вариант (верхний) функции никак нельзя написать в инклюднике?

 

Rosh писал (а):
Я правильно понял, что самый первый вариант (верхний) функции никак нельзя написать в инклюднике?

Инклудник тут не при делах. Такая фанкшин нигде не прокатит. И дело вовсе не в параметрах, передаваемых по ссылке, а в умолчательных параметрах. Умолчательные параметры должны быть последними в списке параметров любой функции. Да ты и сам уже это понял. .. ;-)

 
Хотелось сделать так, чтобы "лишние параметры" дописывались в "переопределяемую" функцию в конце, но подумал и решил, что и так будет не страшно.
Можно будет элементарным Copy&Past менять советники в нужную сторону.
 

Значит так. Структур в языке нет. Ну, вообщем, и ладно. Массив возвращать из функции нельзя. Жаль. Параметры по ссылке нельзя передавать в библиотечные функции. Хм. Кому, тогда вообще передача параметров по ссылке нужна в пределах одного модуля? А ведь по определению язык работает со структурной информаций и нужны инструменты для ее транспортировки.

Остается только один извращенский метод - положить все в строку "param1;param2;param3", а потом ее парсить по разделителю.

Но очень устаешь от этих постоянных ворк-эроундов.


Можно записать как пожелание, наверное, к MQL5 - хотя бы что-то одно - структуры (с возможностью их возврата и передачи в качестве параметров), возврат массива, передача параметров по ссылке в библиотечную функцию.

 
Структуры будут точно. Насчет возвращаемых значений из функций может сказать Слава.
 
Вот что сказал Слава: возвращать из функции структуры можно будет. НО! - не рекомендуется. Даже при программировани на Cи это нежелательно, так как получается overhead. Массивы возвращать по-прежнему нельзя будет.
 

ну уж если даже у Славы не получается.....

Переходим на Pascal !!!! его в средней школе учат.

 

Как Вы представляете себе возврат массива из функции при отсутствии адресной арифметики?

В C, C++ массив тоже нельзя возвратить. Можно возвратить указатель (а с указателем работать, как с массивом). И то это очень опасный путь, если не знать, как распределяется и освобождается память при выполнении программ.

Передавайте массив по ссылке и заполняйте его в вызываемой функции. Тоже самое я могу сказать про структуры - лучше предать объект структуры по ссылке, чем возвращать структуру из функции. Оверхед, о котором говорил Рашид, заключается в излишнем копировании данных.

 

1.
На разных языках разговариваем.
"Возврат массива" означает изменение элементов массива.
Поэтому "передача массива" не означает его перезапись на новое место = можно конечно переписать, но так уж повелось))) передают только указатель.
Если укакзатель не попадает -у Славы получается "overhead", но этого не может быть, т.к. такой среде программирования доверять нельзя.
Т.е. не работает динамическое распределение памяти. НО, это API. Значит API либо не работает или МТ-5 пытаются построить без API.
Действительно, зачем трейдреам API если адресация планарная))))
2. Недоумение вызывает: - структуры возвращаются (значит перезаписывается копия)))))))))))))))))))) а массивы якобы нельзя, тут якобы нужно адрес передавать)))
3.Адресная арифметика у Вас есть, - не надо прибедняться. например double& My_Var;

 
У меня тоже есть некоторое недоумение, но вызванное не высказыванием Славы.
 

Лично меня MQL-4 вполне устраивает.
Однако - зачем дразнить.
Одно дело - выложили бы MQL-5 как получилось бесплатно или даже как считатете нужным - Спасибо Вам.

И, совсем другое - публично сообщать о таком несчастье: якобы не сделали потому что якобы для передачи массива нет адресной арифметики)))) Да вот же она, в Металанге.

Причина обращения: