Глобальные переменные и глобальные переменные клиентского терминала.

 

Начало дискусии здесь 'Какие события вызывают переполнение стека?'

dokpiknik писал(а) >>

И всё потому, что в MQL4 не предусмотрены глобальные массивы.

Mathemat писал(а) >>

Ну как же это, уважаемый, не предусмотрены? Предусмотрены - и еще как. Объявляются точно так же, как и в Си. Может быть, Вы не умеете их готовить?

Звучит провокационно. Ну, да ладно. Наше непонимание друг друга имеет источником путаницу понятий глобальная переменная (массив) и глобальная переменная (массив) клиентского терминала, происхождение которой состоит в недостаточной детерминации и локализации этих понятий в документации. Авторы часто используют в контексте понятие глобальная переменная в смысле глобальная переменная клиентского терминала, что категорически недопустимо, потому что приводит к превратному пониманию смысла излагаемого. Представьте, кто бы мог что-нибудь понять, если бы известная монография Фихтенгольца "Курс матанализа" грешила бы подобным...? Избежать путаницы можно, заменив длинное, неудобное понятие глобальная переменная (массив) клиентского терминала, например, понятием суперпеременная (супермассив) или каким-то другим самовыражающимся подходящим словом, чтобы подчеркнуть разную "степень глобализации" двух важных терминов.

Теперь к "моим баранам". Я обеими руками за фрагментацию программы, за разбиение её на несколько небольних функций (преимущества такого подхода очевидны и Вами упомянуты). Из циклов программы start() обращаться к функциям, передавая им элементы массивов (посредством простых переменных) по причине существенного увеличения времени обработки не оптимально. Остаётся два варианта - либо сделать массивы "видимыми" в функции через их "глобализацию" (использовать неудобный способ создания квази-глобальных массивов клиентского терминала, которые являются по сути совокупностью отдельных глобальных переменных клиентского терминала с присвоенными им программистом номерами), либо передавать ИМЕНА МАССИВОВ в функции, замещающие соответствующие формальные параметры функций. Я полагал, что второй вариант не возможен, поскольку в документации указано на то, что в функции допустимо передавать только константы, выражения и переменные. Может быть под переменными авторы документации подразумевают также имена массивов? Так ли это? Помогите разобраться. Спасибо.

 
массивы и переменные обьявленные в части описания программы видны из всех пользовательских функций, пример: это массивы - буфера линий индикаторов
 
dokpiknik >>:

Начало дискусии здесь 'Какие события вызывают переполнение стека?'


Теперь к "моим баранам". Я обеими руками за фрагментацию программы, за разбиение её на несколько небольних функций (преимущества такого подхода очевидны и Вами упомянуты). Из циклов программы start() обращаться к функциям, передавая им элементы массивов (посредством простых переменных) по причине существенного увеличения времени обработки не оптимально. Остаётся два варианта - либо сделать массивы "видимыми" в функции через их "глобализацию" (использовать неудобный способ создания квази-глобальных массивов клиентского терминала, которые являются по сути совокупностью отдельных глобальных переменных клиентского терминала с присвоенными им программистом номерами), либо передавать ИМЕНА МАССИВОВ в функции, замещающие соответствующие формальные параметры функций. Я полагал, что второй вариант не возможен, поскольку в документации указано на то, что в функции допустимо передавать только константы, выражения и переменные. Может быть под переменными авторы документации подразумевают также имена массивов? Так ли это? Помогите разобраться. Спасибо.

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

Так какая же "степень глобализации" Вам нужна?

 
dokpiknik писал(а) >>

Представьте, кто бы мог что-нибудь понять, если бы известная монография Фихтенгольца "Курс матанализа" грешила бы подобным...?

Рекомендую двухтомник Никольского или трёхтомник Кудрявцева. Там ошибок - минимум. Кудрявцев немного попроще в понимании.

С терминологией действительно путаница. Предлагаю для определённости называть глобальные переменные переменными терминала. А переменные с областью видимости в текущем модуле глобальными переменными. Такая терминология будет больше соответствовать и смыслу и принятым нормам в "С".

 
xrust писал(а) >>
массивы и переменные обьявленные в части описания программы выдны из всех пользовательских функций, пример: это массивы - буфера линий индикаторов

Спасибо. Это чрезвычайно удобно, если я Вас правильно понял! Не надо заботиться о передаче в функцию массивов. С другой стороны можно внутри функции менять по своему усмотрению значения элементов массива, используя привычный, удобный способ их идентификации вроде arrey[i,j]. Это правильно?

Может быть, несколько слов о том, какой смысл тогда передачи данных через формальные параметры? В том числе массивов (https://docs.mql4.com/ru/basis/variables/formal). Просто дополнительная не часто используемая возможность?

 
TheXpert писал(а) >>

Так какая же "степень глобализации" Вам нужна?

Мне нужно обрабатывать массивы, созданные и обрабатываемые в стандартных программах init(), start(), и deinit(), также в функциях.

 
dokpiknik писал(а) >>

Мне нужно обрабатывать массивы, созданные и обрабатываемые в стандартных программах init(), stert(), и deinit(), также в функциях.

так обьявите их на глобальном уровне и пользуйтесь :)

 
dokpiknik >>:

Может быть, несколько слов о том, какой смысл тогда передачи данных через формальные параметры? В том числе массивов (https://docs.mql4.com/ru/basis/variables/formal). Просто дополнительная не часто используемая возможность?

Для увеличения универсальности функций. Например, встроенная функция iMAOnArray пользует массив в качестве параметра. Любой другой способ передачи массива в тело функции приведет к существенному снижению универсальности функции. Именно для этого функции собсно и нужны :).


А вообще странные Вы вопросы задаете. Для человека, написавшего код на MQL размером в несколько тысяч строк...

______________

Ясно. Разгребите кашу у Вас в голове, посмотрите примеры.

 
Shaitan писал(а) >>

С терминологией действительно путаница. Предлагаю для определённости называть глобальные переменные переменными терминала. А переменные с областью видимости в текущем модуле глобальными переменными. Такая терминология будет больше соответствовать и смыслу и принятым нормам в "С".

Неплохо!

 
TheXpert писал(а) >>

Для увеличения универсальности функций. Например, встроенная функция iMAOnArray пользует массив в качестве параметра. Любой другой способ передачи массива в тело функции приведет к существенному снижению универсальности функции. Именно для этого функции собсно и нужны :).

А вообще странные Вы вопросы задаете. Для человека, написавшего код на MQL размером в несколько тысяч строк...

______________

Ясно. Разгребите кашу у Вас в голове, посмотрите примеры.

Спасибо, Андрей, за примеры. За "кашу" тоже. Кстати, этим самым "разгребанием" с Вашей помощью и с помощью других, спасибо всем принявшим в дискусии участие, я и занимаюсь. Правда, если мои или чьи-то "дурацкие" вопросы кого-то раздражают и обременяют, может, просто не стоит на них реагировать? Надеюсь, что найдутся программисты, которые понимают, что несмотря на всю их программистскую гениальность, всего знать нельзя, и поэтому будут толерантно относться к незнанию других, с полным основанием расчитывая, что в своё время и их не оставят в одиночестве с их проблемами. Так что призываю на форуме к политкорректности.

 
Shaitan писал(а) >>

Рекомендую двухтомник Никольского или трёхтомник Кудрявцева. Там ошибок - минимум. Кудрявцев немного попроще в понимании.

С терминологией действительно путаница. Предлагаю для определённости называть глобальные переменные переменными терминала. А переменные с областью видимости в текущем модуле глобальными переменными. Такая терминология будет больше соответствовать и смыслу и принятым нормам в "С".

Переменные терминала уже называются глобальными переменными, этот термин закрепился, используется в хелпе, разработчики МТ не будут менят терминологию. Можно другой термин использовать - глобальные переменные программного модуля или глобальные переменные эксперта/индикатора/скрипта.

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