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

 
Andrei01:

это называется передача внешней переменной по адресу, локальной переменной не создается. если бы было func1(int x), то тогда создается локальная переменная.

Для функции это локальная переменная. Снаружи это передача по ссылке.

Зачем спорить? Поменяй имя параметра и посмотри.

 

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

 
Andrei01:

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

Это не баг. Не надо называть параметр именем глобальной переменной.
 

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

 
Andrei01:

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

Так она и работает согласно себя, но с учётом, что локальная переменная в приоритете. Так принято в стандарте.
 
если бы это была локальная переменная то при выходе из функции внешняя переменная не изменялась бы, но это не так.
 
Andrei01:
если бы это была локальная переменная то при выходе из функции внешняя переменная не изменялась бы, но это не так.
Глобальная переменная не меняется. func2() это показывает.
 
Zhunko:
Так она и работает согласно себя, но с учётом, что локальная переменная в приоритете. Так принято в стандарте.

Вадим лучше не пишите глупости, если не понимаете и лень проверить.


Можно назвать переменную внутри func1 хоть XX, результат все равно будет такой же неверный.

//---------
void func1(int& xx)
{
        xx=1;
        Print("func1: x=",xx);
        func2();
}

func1: x=1
func2: x=0


но если в init() поставить func2() после func1()

int init()
{
  func1(x);
  func2();
}


то результат уже по выходу из func1 покажет верный

func1: x=1
func2: x=0
func2: x=1


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


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

int x;

//---------
void func1(int& xx)
{
        xx=1;
        Print("func1: x=",xx);
        func2();
}
//---------
void func2()
{ 
        Print("func2: x=",x);
}

//------------------------------------------------------------------    OnStart
void OnStart()
{
  func1(x);
  return;
}


В MQL5 результат правильно ожидаемый

func1: x=1
func2: x=1
значение переменной, передаваемой по ссылке изменяется сразу в ней.

 
Да. Лень было не только мне, но глупостей не писал. Иначе, не понятно из чего исходили разработчики для такого результата.
 

Есть предложение Метаквотам.

Добавте, пожалуйста, строчку в terminal.ini и в metaeditor.ini, чтобы запоминал последнее состояние кнопки "развернуть на весь экран".