Новая версия MetaTrader 4 Client Terminal build 432 - страница 23

 
м-да.. прямо как в анекдоте..
 
sergeev:


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


Это не баг. Это именно так и реализовано с самого начала. А именно: "Обновление значения переменной, передаваемой по ссылке, происходит только после выхода из функции."

И это поведение не будет меняться.

 
stringo:

А именно: "Обновление значения переменной, передаваемой по ссылке, происходит только после выхода из функции."

И это поведение не будет меняться.

это значит что вы полностью нарушаете работу всех вложенных функций. смысл этого нововведения не понятен.
 
stringo:


При вызове окна свойств советника, клавиша "ОК" выделена по умолчанию, но на "Enter" с клавиатуры не реагирует (только мышкой).
Нельзя ли подправить? Пустячок ведь, но с клавиатуры удобнее закрывать окно.
 
Andrei01:
это значит что вы полностью нарушаете работу всех вложенных функций. смысл этого нововведения не понятен.

Какое нововведение? В MQL4 так было всегда.

В чём нарушение? После завершения функции вы получаете изменённое значение.

 
stringo:

Какое нововведение? В MQL4 так было всегда.

В чём нарушение? После завершения функции вы получаете изменённое значение.

Возможно, так и было всегда. Я, например, этого не знал. Но, согласитесь, достаточно тяжело помнить такие вот нюансы, когда работаешь на трех языках (MQL4, MQL5 и C++), которые декларируются как родственные. Получается, что в пору составлять некую таблицу отличий в поведении:

Поведение MQL4 MQL5 C++
Переменная, переданная в функцию по ссылке/указателю Меняет значение только после выхода из функцииЗначение изменяется в процессе выполнения функцииЗначение изменяется в процессе выполнения функции

Не спорю, таких примеров с другими нюансами в поведении различных языков программирования можно привести массу, не касаясь MQL4 и MQL5 (чего только стоят различные компиляторы C++). Но для чего сделано подобное отличие в MQL4 и почему такое поведение все же изменено в MQL5 - непонятно.

 
stringo:

Какое нововведение? В MQL4 так было всегда.

В чём нарушение? После завершения функции вы получаете изменённое значение.

нарушение в том, что любую переменную в пределах области видимости принято считать измененной сразу после изменения её в коде, а не после всевозможных исскуственных задержек, что делает отладку программы непредсказуемой.

к тому же нарушается основное правило видимости переменных - внешняя переменная невидима внутри вложенной функции, что противоречит основам программирования.

зачем понадобилась такая неадекватная логика программирования непонятно.

 
Andrei01:

нарушение в том, что любую переменную в пределах области видимости принято считать измененной сразу после изменения её в коде, а не после всевозможных исскуственных задержек, что делает отладку программы непредсказуемой.


Нужно правильно понимать особенности построения (любого) языка программирования. В любом языке есть два типа закономерностей:

1. Жёсткие закономерности, придерживаться которых обязательно - это такие, которые диктуются правилами математики и законами логики.
2. Закономерности, которые закладываются по свободному выбору разработчиков, - для таких нет принципиальных оснований.

Языки потому и отличаются, что 2й тип закономерностей все разработчики закладывают из каких-то своих соображений.
В данном случае нужно просто знать, что в MQL4 это сделано так.

В подобном коде

int x;

init(){
func1(x);
}
//---------
void func1(int& x){

x = 1;
Alert("func1:x=",x);
func2();
}
//---------
void func2(){

Alert("func2:x=",x);
}
//---------

не нужно передавать глобальную переменную по ссылке. И не стоит внутри функции использовать одинаковые названия для глобальной и локальной переменных.



int Glob_X;

int init()
{
func1();
}
//---------
void func1()
{
Alert("func1:Glob_X=",Glob_X); // на входе 0
Glob_X = 1; // явно меняем значение
Alert("func1:Glob_X=",Glob_X); // текущее значение 1
func2();
}
//---------
void func2()
{
Alert("func2:Glob_X=",Glob_X);// текущее значение 1
}
//---------

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

 

Подскажите МТ4 со старой историей котировок? Желательно, чтоб котировки eur-usd с 1990 года были, побольше различных инструментов, фьючи и т.д.

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

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

хотя конечно тот кто не знает этого причуда MQ4 будет иметь очень трудно-находимые баги.