Начало дискусии здесь 'Какие события вызывают переполнение стека?'
Теперь к "моим баранам". Я обеими руками за фрагментацию программы, за разбиение её на несколько небольних функций (преимущества такого подхода очевидны и Вами упомянуты). Из циклов программы start() обращаться к функциям, передавая им элементы массивов (посредством простых переменных) по причине существенного увеличения времени обработки не оптимально. Остаётся два варианта - либо сделать массивы "видимыми" в функции через их "глобализацию" (использовать неудобный способ создания квази-глобальных массивов клиентского терминала, которые являются по сути совокупностью отдельных глобальных переменных клиентского терминала с присвоенными им программистом номерами), либо передавать ИМЕНА МАССИВОВ в функции, замещающие соответствующие формальные параметры функций. Я полагал, что второй вариант не возможен, поскольку в документации указано на то, что в функции допустимо передавать только константы, выражения и переменные. Может быть под переменными авторы документации подразумевают также имена массивов? Так ли это? Помогите разобраться. Спасибо.
Наверное, Mathemat имел в виду массивы описываемые в той же области видимости, что и внешние переменные. Эти массивы видны всем функциям советника. Да и передача оных по ссылке (или значению) не вызывает проблем. Другое дело, если массив надо шарить между советниками. Но вообще-то если это так, скорей всего, можно изменить логику и передавать не массив а единичные данные, которые действительно важны, еще и с упрощением логики.
Так какая же "степень глобализации" Вам нужна?
Представьте, кто бы мог что-нибудь понять, если бы известная монография Фихтенгольца "Курс матанализа" грешила бы подобным...?
Рекомендую двухтомник Никольского или трёхтомник Кудрявцева. Там ошибок - минимум. Кудрявцев немного попроще в понимании.
С терминологией действительно путаница. Предлагаю для определённости называть глобальные переменные переменными терминала. А переменные с областью видимости в текущем модуле глобальными переменными. Такая терминология будет больше соответствовать и смыслу и принятым нормам в "С".
массивы и переменные обьявленные в части описания программы выдны из всех пользовательских функций, пример: это массивы - буфера линий индикаторов
Спасибо. Это чрезвычайно удобно, если я Вас правильно понял! Не надо заботиться о передаче в функцию массивов. С другой стороны можно внутри функции менять по своему усмотрению значения элементов массива, используя привычный, удобный способ их идентификации вроде arrey[i,j]. Это правильно?
Может быть, несколько слов о том, какой смысл тогда передачи данных через формальные параметры? В том числе массивов (https://docs.mql4.com/ru/basis/variables/formal). Просто дополнительная не часто используемая возможность?
Может быть, несколько слов о том, какой смысл тогда передачи данных через формальные параметры? В том числе массивов (https://docs.mql4.com/ru/basis/variables/formal). Просто дополнительная не часто используемая возможность?
Для увеличения универсальности функций. Например, встроенная функция iMAOnArray пользует массив в качестве параметра. Любой другой способ передачи массива в тело функции приведет к существенному снижению универсальности функции. Именно для этого функции собсно и нужны :).
А вообще странные Вы вопросы задаете. Для человека, написавшего код на MQL размером в несколько тысяч строк...
______________
Ясно. Разгребите кашу у Вас в голове, посмотрите примеры.
С терминологией действительно путаница. Предлагаю для определённости называть глобальные переменные переменными терминала. А переменные с областью видимости в текущем модуле глобальными переменными. Такая терминология будет больше соответствовать и смыслу и принятым нормам в "С".
Неплохо!
Для увеличения универсальности функций. Например, встроенная функция iMAOnArray пользует массив в качестве параметра. Любой другой способ передачи массива в тело функции приведет к существенному снижению универсальности функции. Именно для этого функции собсно и нужны :).
А вообще странные Вы вопросы задаете. Для человека, написавшего код на MQL размером в несколько тысяч строк...
______________
Ясно. Разгребите кашу у Вас в голове, посмотрите примеры.
Спасибо, Андрей, за примеры. За "кашу" тоже. Кстати, этим самым "разгребанием" с Вашей помощью и с помощью других, спасибо всем принявшим в дискусии участие, я и занимаюсь. Правда, если мои или чьи-то "дурацкие" вопросы кого-то раздражают и обременяют, может, просто не стоит на них реагировать? Надеюсь, что найдутся программисты, которые понимают, что несмотря на всю их программистскую гениальность, всего знать нельзя, и поэтому будут толерантно относться к незнанию других, с полным основанием расчитывая, что в своё время и их не оставят в одиночестве с их проблемами. Так что призываю на форуме к политкорректности.
Рекомендую двухтомник Никольского или трёхтомник Кудрявцева. Там ошибок - минимум. Кудрявцев немного попроще в понимании.
С терминологией действительно путаница. Предлагаю для определённости называть глобальные переменные переменными терминала. А переменные с областью видимости в текущем модуле глобальными переменными. Такая терминология будет больше соответствовать и смыслу и принятым нормам в "С".
Переменные терминала уже называются глобальными переменными, этот термин закрепился, используется в хелпе, разработчики МТ не будут менят терминологию. Можно другой термин использовать - глобальные переменные программного модуля или глобальные переменные эксперта/индикатора/скрипта.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Начало дискусии здесь 'Какие события вызывают переполнение стека?'
И всё потому, что в MQL4 не предусмотрены глобальные массивы.
Mathemat писал(а) >>
Ну как же это, уважаемый, не предусмотрены? Предусмотрены - и еще как. Объявляются точно так же, как и в Си. Может быть, Вы не умеете их готовить?
Звучит провокационно. Ну, да ладно. Наше непонимание друг друга имеет источником путаницу понятий глобальная переменная (массив) и глобальная переменная (массив) клиентского терминала, происхождение которой состоит в недостаточной детерминации и локализации этих понятий в документации. Авторы часто используют в контексте понятие глобальная переменная в смысле глобальная переменная клиентского терминала, что категорически недопустимо, потому что приводит к превратному пониманию смысла излагаемого. Представьте, кто бы мог что-нибудь понять, если бы известная монография Фихтенгольца "Курс матанализа" грешила бы подобным...? Избежать путаницы можно, заменив длинное, неудобное понятие глобальная переменная (массив) клиентского терминала, например, понятием суперпеременная (супермассив) или каким-то другим самовыражающимся подходящим словом, чтобы подчеркнуть разную "степень глобализации" двух важных терминов.
Теперь к "моим баранам". Я обеими руками за фрагментацию программы, за разбиение её на несколько небольних функций (преимущества такого подхода очевидны и Вами упомянуты). Из циклов программы start() обращаться к функциям, передавая им элементы массивов (посредством простых переменных) по причине существенного увеличения времени обработки не оптимально. Остаётся два варианта - либо сделать массивы "видимыми" в функции через их "глобализацию" (использовать неудобный способ создания квази-глобальных массивов клиентского терминала, которые являются по сути совокупностью отдельных глобальных переменных клиентского терминала с присвоенными им программистом номерами), либо передавать ИМЕНА МАССИВОВ в функции, замещающие соответствующие формальные параметры функций. Я полагал, что второй вариант не возможен, поскольку в документации указано на то, что в функции допустимо передавать только константы, выражения и переменные. Может быть под переменными авторы документации подразумевают также имена массивов? Так ли это? Помогите разобраться. Спасибо.