Выпущен MetaTrader 4 Client Terminal build 600 с обновленным языком MQL4 и Маркетом приложений - страница 102
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Было бы неплохо сделать функцию которая позволит организовать всплывающие подсказки для extern в настройках входных параметров.
Зачем? Добавьте после внешней переменной комментарий в той же строке, и в окне параметров будет отображаться текст комментария, а не имя переменной.
Цитаты из справки:
1. "Переменная, объявленная внутри блока (часть кода, заключенная в фигурные скобки), принадлежит локальной области видимости. Такая переменная не видна (поэтому и недоступна) за пределами блока, в котором она объявлена. Самый распространенный случай локального объявления – переменная, объявленная внутри функции. ... Так как областью видимости локальной переменной является блок, в котором она объявлена, то существует возможность объявлять переменные с именем, совпадающим с именами переменных, объявленных в других блоках; а также объявленных на более верхних уровнях, вплоть до глобального."
Но если я объявляю на глобальном уровне int i; и в функции также объявляю int i; то компилятор выдает предупреждение: "declaration of 'i' hides global declaration at line 43 111.mq4 192 12"
2. "Переменная, объявленная локально, располагается на стеке, и время жизни такой переменной совпадает со временем жизни функции. "
Я полагаю, после обращения к функции, переменная объявленная в функции, умирает. При новом обращении, переменная инициализируется, и если значение не задано, то по умолчанию будет "0". (во всяком случае так было раньше). Приведенный ниже код использую для определения значений по каждому инструменту при переборе массива расположенного в функции start(). При объявлении double fProfit; происходит накопление значений (нарастающим итогом). А когда инициализировал double fProfit=0;, тогда все стало работать нормально.
Это ошибки в справке? в программе? или я что-то неправильно понимаю?
Цитаты из справки:
1. "Переменная, объявленная внутри блока (часть кода, заключенная в фигурные скобки), принадлежит локальной области видимости. Такая переменная не видна (поэтому и недоступна) за пределами блока, в котором она объявлена. Самый распространенный случай локального объявления – переменная, объявленная внутри функции. ... Так как областью видимости локальной переменной является блок, в котором она объявлена, то существует возможность объявлять переменные с именем, совпадающим с именами переменных, объявленных в других блоках; а также объявленных на более верхних уровнях, вплоть до глобального."
Но если я объявляю на глобальном уровне int i; и в функции также объявляю int i; то компилятор выдает предупреждение: "declaration of 'i' hides global declaration at line 43 111.mq4 192 12"
2. "Переменная, объявленная локально, располагается на стеке, и время жизни такой переменной совпадает со временем жизни функции. "
Я полагаю, после обращения к функции, переменная объявленная в функции, умирает. При новом обращении, переменная инициализируется, и если значение не задано, то по умолчанию будет "0". (во всяком случае так было раньше). Приведенный ниже код использую для определения значений по каждому инструменту при переборе массива расположенного в функции start(). При объявлении double fProfit; происходит накопление значений (нарастающим итогом). А когда инициализировал double fProfit=0;, тогда все стало работать нормально.
Это ошибки в справке? в программе? или я что-то неправильно понимаю?
Пора бы уже привыкать к явной инициализации переменных. Если переменная не инициализирована, то ее значение не определено. Может быть что угодно. Если Вас это устраивает, то продолжайте задавать вопросы.
Цитаты из справки:
1. "Переменная, объявленная внутри блока (часть кода, заключенная в фигурные скобки), принадлежит локальной области видимости. Такая переменная не видна (поэтому и недоступна) за пределами блока, в котором она объявлена. Самый распространенный случай локального объявления – переменная, объявленная внутри функции. ... Так как областью видимости локальной переменной является блок, в котором она объявлена, то существует возможность объявлять переменные с именем, совпадающим с именами переменных, объявленных в других блоках; а также объявленных на более верхних уровнях, вплоть до глобального."
Но если я объявляю на глобальном уровне int i; и в функции также объявляю int i; то компилятор выдает предупреждение: "declaration of 'i' hides global declaration at line 43 111.mq4 192 12"
2. "Переменная, объявленная локально, располагается на стеке, и время жизни такой переменной совпадает со временем жизни функции. "
Я полагаю, после обращения к функции, переменная объявленная в функции, умирает. При новом обращении, переменная инициализируется, и если значение не задано, то по умолчанию будет "0". (во всяком случае так было раньше). Приведенный ниже код использую для определения значений по каждому инструменту при переборе массива расположенного в функции start(). При объявлении double fProfit; происходит накопление значений (нарастающим итогом). А когда инициализировал double fProfit=0;, тогда все стало работать нормально.
Это ошибки в справке? в программе? или я что-то неправильно понимаю?
По п1. На то и Глобальная переменная - область видимости вся программа. И не надо путать глобальную переменную с переменной объявленной внутри start() и внутри функций. И там и там можете использовать ее по количеству функций включая терминальные.
Мало того, можете внутри одной функции несколько раз инициализировать одну и ту же переменную например в циклах
По п2. Да, уж....
Но если я объявляю на глобальном уровне int i; и в функции также объявляю int i; то компилятор выдает предупреждение: "declaration of 'i' hides global declaration at line 43 111.mq4 192 12"
Всё правильно. Глобальные переменные ведь внутри функции тоже видны, и если вы внутри функции объявляете локальную переменную с тем же именем, то глобальная переменная внутри этой функции становится вам недоступна, ведь вы её переопределили. А если в этой функции глобальная переменная тоже используется (вернее, вы предполагаете, что используется, забыв о том, что вы её переопределили), то такое переопределение приведёт к ошибке. Компилятор в таких случаях обязательно должен выдать предупреждение, что он и делает.
Я полагаю, после обращения к функции, переменная объявленная в функции, умирает. При новом обращении, переменная инициализируется, и если значение не задано, то по умолчанию будет "0". (во всяком случае так было раньше).
Теперича - не то, что давеча. (с) Возьмите за правило никогда не писать:
double i;
а всегда писать:
double i = 0;
Это хорошая привычка, от многих неожиданностей убережёт. Объявление переменной - это просто выделение памяти под неё. А в выделенной памяти может содержаться любой хлам, оставшийся от предыдущего использования, она не обязательно пустая.
Теперича - не то, что давеча. (с) Возьмите за правило никогда не писать:
double i;
а всегда писать:
double i = 0;
Это хорошая привычка, от многих неожиданностей убережёт. Объявление переменной - это просто выделение памяти под неё. А в выделенной памяти может содержаться любой хлам, оставшийся от предыдущего использования, она не обязательно пустая.
Зачем? Добавьте после внешней переменной комментарий в той же строке, и в окне параметров будет отображаться текст комментария, а не имя переменной.
Покажите пожалуйста как это выглядит, не встречал подобного тому, что Вы описали.
Кроме как типа: extern string S1 = "нужный комментарий". Но отдельная строка неудобна, т.к. ширина колонок "Переменная/Значение" и ширина окна настроек не регулируются, поэтому иногда видимой части недостаточно для отображения необходимого текста. Еще бывает необходимо давать комменты чуть ли не по каждой строке, и этот способ не добавляет удобочитаемости списка настроек.
Покажите пожалуйста как это выглядит, не встречал подобного тому, что Вы описали.
Кроме как типа: extern string S1 = "нужный комментарий". Но отдельная строка неудобна, т.к. ширина колонок "Переменная/Значение" и ширина окна настроек не регулируются, поэтому иногда видимой части недостаточно для отображения необходимого текста. Еще бывает необходимо давать комменты чуть ли не по каждой строке, и этот способ не добавляет удобочитаемости списка настроек.
input int kjh456jjr785 = 0; //Этот текст будет вместо kjh456jjr785
input int kjh456jjr785 = 0; //Этот текст будет вместо kjh456jjr785
Поставил как Вы написали, и ничего нету ...
input int kjh456jjr785 = 0; //Этот текст будет вместо kjh456jjr785
как задано "kjh456jjr785", так это и показывает. Что-то не так?