Вопрос по учебнику Сергея Ковалёва - страница 2

 
khorosh писал (а) >>

Спасибо. Только я бы предпочёл ответ на мой вопрос да или нет. А если нет пояснить почему. А чем отличается глобальная переменная от глобальной переменной терминала везде хорошо объяснено и у меня такого вопроса не возникало.

Мне показалось, что Вы немного обиделись. Если так, то извините, у меня и в мыслях не было посмеяться. Я и сам люблю всё на примерах.

Вопрос, который Вы задаёте, касается приведения типов данных.

Приведение типов данных происходит независимо от того, какого вида переменная.

например, в выражени

double d;

int i = d + 1.0;

сначала справа от знака равенства вычисляется действительное значение выражения d+1.0, а потом это значение присваивается целой переменной i. Здесь происходит приведение действительного значения к целевому целому типу в момент присваивания.

Применительно к Вашему вопросу - неважно глобальные или локальные переменные участвуют в вычислениях. Принимается во внимание только их тип.

.

Глобальной переменной клиентского терминала нельзя напрямую присвоить значение, используя для этого оператор присваивания.

Стандарт функции в перечне параметров предусматривает действительное значение, присваиваемое глоб. переменной кл. терминала:

datetime GlobalVariableSet( string name, double value)

Присвоение значения глобальной переменной клиентского терминала выполняется с помощью функции:

int i = 5;
GlobalVariableSet( GV_name, i);

Здесь в вызове функции вторым параметром указана переменная целого типа i. Но глоб. переменная кл. терминала GV_name в конечном счёте получит действительное значение.

Происходит это так. Ещё до того, как значение i будет присвоено переменной GV_name, оно преобразуется в действительный тип.

1. Программа обращается к переменной i и берёт её значение - значение целого типа 5 .

2. Программа, зная стандарт функции, преобразует целое значение 5 в действительное 5.0.

3. Программа исполняет функцию GlobalVariableSet(), т.е. присваивает 5.0 переменной GV_name.

--

В этом вопросе ключевой момент - правила приведения типов.

Можно помотреть здесь: Учебник по MQL4 Основы языка Операции и выражения

 
SK. писал (а) >>

Мне показалось, что Вы немного обиделись. Если так, то извините, у меня и в мыслях не было посмеяться. Я и сам люблю всё на примерах.

Вопрос, который Вы задаёте, касается приведения типов данных.

Приведение типов данных происходит независимо от того, какого вида переменная.

например, в выражени

сначала справа от знака равенства вычисляется действительное значение выражения d+1.0, а потом это значение присваивается целой переменной i. Здесь происходит приведение действительного значения к целевому целому типу в момент присваивания.

Применительно к Вашему вопросу - неважно глобальные или локальные переменные участвуют в вычислениях. Принимается во внимание только их тип.

.

Глобальной переменной клиентского терминала нельзя напрямую присвоить значение, используя для этого оператор присваивания.

Стандарт функции в перечне параметров предусматривает действительное значение, присваиваемое глоб. переменной кл. терминала:

Присвоение значения глобальной переменной клиентского терминала выполняется с помощью функции:

Здесь в вызове функции вторым параметром указана переменная целого типа i. Но глоб. переменная кл. терминала GV_name в конечном счёте получит действительное значение.

Происходит это так. Ещё до того, как значение i будет присвоено переменной GV_name, оно преобразуется в действительный тип.

1. Программа обращается к переменной i и берёт её значение - значение целого типа 5 .

2. Программа, зная стандарт функции, преобразует целое значение 5 в действительное 5.0.

3. Программа исполняет функцию GlobalVariableSet(), т.е. присваивает 5.0 переменной GV_name.

--

В этом вопросе ключевой момент - правила приведения типов.

Можно помотреть здесь: Учебник по MQL4 Основы языка Операции и выражения

То, что я обиделся, Вы ошибаетесь. Я лишь хотел сказать, что ответ был не на мой вопрос. А вот теперь ответ был исчерпывающим. Большое вам спасибо. Я благодарю Вас за хороший учебник,

который выполняет для меня роль настольной книги. А вопрос у меня возник, когда я впервые решил использовать глобальную переменную терминала и не особо задумываясь, ввел в init() - datetime GlobalVariableSet("TotMax",TotMax), так как указано в справке; и у меня при компиляции возникла ошибка. И тогда я стал смотреть учебник. Как теперь я понял тип datetime нужно использовать для переменной. если в неё мы хотим получить время последнего доступа, т.е. например datetime T = GlobalVariableSet("TotMax",TotMax), а если мы хотим только создать глобальную переменную или установить её новое значение, то datetime перед этой функцией указывать не надо.

 
khorosh писал (а) >>

Как теперь я понял тип datetime нужно использовать для переменной. если в неё мы хотим получить время последнего доступа, т.е. например datetime T = GlobalVariableSet("TotMax",TotMax), а если мы хотим только создать глобальную переменную или установить её новое значение, то datetime перед этой функцией указывать не надо.

В целом правильно. Но тут дело немного не в том.

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

Всё дело сводится к тому, хотим мы в дальнейшем использовать это возвращаемое значение или нет.

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

например, в таком виде

int Kolichestvo = OrdersTotal();

или в таком

for (i=1;i<=OrdersTotal();i++)

В обоих случаях мы используем значение, возвращаемое функцией.

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

GlobalVariableSet( GV_name, 77.0);

При выполнении этой записи функция исполнится - глобальной переменной клиентского терминала GV_name будет присвоено значение 77.0, и функция (по определению) возвращает время, когда это присвоение произошло. Здесь, хотя функция и возвращает значение, но никакая переменная его не принимает - нет переменной, в которую записано было бы возвращаемое значение.

А можно написать так:

datetime t;
t = GlobalVariableSet( GV_name, 77.0);

или так:

datetime t = GlobalVariableSet( GV_name, 77.0);

что одно и то же.

В этом случае происходит то же самое присвоение переменной GV_name значения 77.0. Но теперь уже есть переменная t типа datetime, которая принимает значение, возвращаемое функцией. В дальнейшем эта переменная может как-то участвовать в вычислениях, например, может понадобиться узнать какая глоб. переменная кл. терминала была изменена последней - для этого нужно сравнивать значение t с каки-то другим временем t2..

--

Вот эта запись

datetime GlobalVariableSet( string name, double value)
и подобные ей в таком виде не используются. Это - запись формата функции - справочный вариант представления. Здесь слово datetime означает тип значения, возвращаемого функцией ( или в просторечии - тип функции). Это слово лишь говорит читателю, что возвращаемое значение - типа datetime . Но из этого не следует делать вывод, что в реальной программе тип значения, возвращаемого функцией (слово datetime ), надо писать перед вызовом функции.
 
SK. писал (а) >>

В целом правильно. Но тут дело немного не в том.

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

Всё дело сводится к тому, хотим мы в дальнейшем использовать это возвращаемое значение или нет.

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

например, в таком виде

или в таком

В обоих случаях мы используем значение, возвращаемое функцией.

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

При выполнении этой записи функция исполнится - глобальной переменной клиентского терминала GV_name будет присвоено значение 77.0, и функция (по определению) возвращает время, когда это присвоение произошло. Здесь, хотя функция и возвращает значение, но никакая переменная его не принимает - нет переменной, в которую записано было бы возвращаемое значение.

А можно написать так:

или так:

что одно и то же.

В этом случае происходит то же самое присвоение переменной GV_name значения 77.0. Но теперь уже есть переменная t типа datetime, которая принимает значение, возвращаемое функцией. В дальнейшем эта переменная может как-то участвовать в вычислениях, например, может понадобиться узнать какая глоб. переменная кл. терминала была изменена последней - для этого нужно сравнивать значение t с каки-то другим временем t2..

--

Вот эта запись

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

Спасибо за подробные объяснения.

 

Подскажите, как правильно распечатать этот учебник (MQl4BookRussian.chm), а то у меня пропадает часть текста справа (читать с монитора - глаза устают). Или этот учебник есть ещё в каком формате кроме chm?