Rosh писал (а):
Я правильно понял, что самый первый вариант (верхний) функции
никак нельзя написать в инклюднике?
Инклудник тут не при делах. Такая фанкшин нигде не прокатит. И дело вовсе не в параметрах, передаваемых по ссылке, а в умолчательных параметрах. Умолчательные параметры должны быть последними в списке параметров любой функции. Да ты и сам уже это понял. .. ;-)
Можно будет элементарным Copy&Past менять советники в нужную сторону.
Значит так. Структур в языке нет. Ну, вообщем, и ладно. Массив возвращать из функции нельзя. Жаль. Параметры по ссылке нельзя передавать в библиотечные функции. Хм. Кому, тогда вообще передача параметров по ссылке нужна в пределах одного модуля? А ведь по определению язык работает со структурной информаций и нужны инструменты для ее транспортировки.
Остается только один извращенский метод - положить все в строку "param1;param2;param3", а потом ее парсить по разделителю.
Но очень устаешь от этих постоянных ворк-эроундов.
Можно записать как пожелание, наверное, к MQL5 - хотя бы что-то одно - структуры (с возможностью их возврата и передачи в качестве параметров), возврат массива, передача параметров по ссылке в библиотечную функцию.
ну уж если даже у Славы не получается.....
Переходим на Pascal !!!! его в средней школе учат.
Как Вы представляете себе возврат массива из функции при отсутствии адресной арифметики?
В C, C++ массив тоже нельзя возвратить. Можно возвратить указатель (а с указателем работать, как с массивом). И то это очень опасный путь, если не знать, как распределяется и освобождается память при выполнении программ.
Передавайте массив по ссылке и заполняйте его в вызываемой функции. Тоже самое я могу сказать про структуры - лучше предать объект структуры по ссылке, чем возвращать структуру из функции. Оверхед, о котором говорил Рашид, заключается в излишнем копировании данных.
1.
На разных языках разговариваем.
"Возврат массива" означает изменение элементов массива.
Поэтому "передача массива" не означает его перезапись на новое место = можно конечно переписать, но так уж повелось))) передают только указатель.
Если укакзатель не попадает -у Славы получается "overhead", но этого не может быть, т.к. такой среде программирования доверять нельзя.
Т.е. не работает динамическое распределение памяти. НО, это API. Значит API либо не работает или МТ-5 пытаются построить без API.
Действительно, зачем трейдреам API если адресация планарная))))
2. Недоумение вызывает: - структуры возвращаются (значит перезаписывается копия)))))))))))))))))))) а массивы якобы нельзя, тут якобы нужно адрес передавать)))
3.Адресная арифметика у Вас есть, - не надо прибедняться. например double& My_Var;
Лично меня MQL-4 вполне устраивает.
Однако - зачем дразнить.
Одно дело - выложили бы MQL-5 как получилось бесплатно или даже как считатете нужным - Спасибо Вам.
И, совсем другое - публично сообщать о таком несчастье: якобы не сделали потому что якобы для передачи массива нет адресной арифметики)))) Да вот же она, в Металанге.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот такая фнукция через компилятор не проходит
Компилятор выдает
',' - 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 предупреждений
Прочитал справку, вроде убедиося, что действительно нельзя (и почему?)
Существует возможность передавать параметры по ссылке. В этом случае модификация таких параметров отразится на соответствующих переменных в вызываемой функции, переданных по ссылке. Параметры по ссылке можно передавать только в пределах одного модуля, для библиотечных функций такая возможность не предусмотрена. Для того чтобы указать, что параметр передается по ссылке, после типа данных необходимо поставить модификатор &.
Пример:
Перенес код в советника, ругается также. Тогда решил перенести три последних параметра в начало, ругаться перестал
Потом решил в таком же виде эту функцию снова определить в инклюднике - и компилятор не ругается!
Есть подозрение, что параметры-ссылки не могут быть определены после параметров, проинициализированных начальными значениями.
Даже нашел сведения об этом в справке
<quote>
Передаваемые в функцию параметры являются локальными. Областью видимости является блок функции. Формальные параметры должны отличаться по именам от внешних переменных и локальных переменных, определенных внутри функции. В блоке функции формальным параметрам могут быть присвоены некоторые значения.
Пример:
Формальные параметры могут быть проинициализированы константами. В этом случае инициализирующее значение считается значением по умолчанию. Параметры, следующие за проинициализированным параметром, должны быть тоже проинициализированы.
Пример:
При вызове такой функции инициализированные параметры можно опускать, вместо них будут подставлены значения по умолчанию </quote>.
С другой стороны, параметры, передающиеся по ссылке, не могут быть проинициализованы. Я правильно понял, что самый первый вариант (верхний) функции никак нельзя написать в инклюднике?