Ошибки, баги, вопросы - страница 3684

 
Добрый день ! На графике не отображает сразу объект линия с стрелочкой . Нет ничего , пусто , . Нужно возиться чтобы показал . 
 
Аргентум #:
Добрый день ! На графике не отображает сразу объект линия с стрелочкой . Нет ничего , пусто , . Нужно возиться чтобы показал . 



Работает:


 
Приветствую. MQL5 не предупреждает о повторном объявлении переменных. Mql4 предупреждает. Пример:
      
   for(int i  = 10; i > 0; i --)
   {
    for(int i = 5; i > 0; i --)
    {
   
    }
   }


Файлы:
test3.mq5  2 kb
test3.mq4  2 kb
 
Andrei Sokolov #:
Приветствую. MQL5 не предупреждает о повторном объявлении переменных. Mql4 предупреждает. Пример:
      


Разные области видимости. Где Вы были примерно год, а то и два - это уже столько времени так.
 
Artyom Trishkin #:
Разные области видимости. Где Вы были примерно год, а то и два - это уже столько времени так.
Привет Артём. Сначала я тоже так подумал. Но ведь в примере цикл в цикле. Разве во вложенном цикле, переменная объявленная во внешнем, не должна быть видима? Как-то тут не всё однозначно.
 

Привет, Алексей.

Вроде бы тут нет неоднозначности. Переменная i из внешнего цикла будет доступна со своим значением во внутреннем цикле, только если там не объявлена переменная с таким же именем. Если объявлена, то подразумевается использование самой внутренней переменной.

Такой код 

int OnInit() {
   for(int i = 10; i > 0; i--) {
      PrintFormat("Before i=%d", i);
      for(int i = 5; i > 0; i--) {
         PrintFormat("Inside i=%d", i);
      }
      PrintFormat("After i=%d", i);
   }

   return(INIT_SUCCEEDED);
}

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

Before i=10
  Inside i=5
  Inside i=4
  Inside i=3
  Inside i=2
  Inside i=1
After i=10
Before i=9
  Inside i=5
  Inside i=4
  Inside i=3
  Inside i=2
  Inside i=1
After i=9
...

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

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

А если во втором цикле хотим использовать только переменную второго цикла, то предупреждение будет мешать.

 
Yuriy Bykov #:
Переменная i из внешнего цикла будет доступна со своим значением во внутреннем цикле, только если там не объявлена переменная с таким же именем. Если объявлена, то подразумевается использование самой внутренней переменной.

Спасиб, понятно. ИМХО это плохое решение.

Лучше бы сворачивание частей кода сделали или работу i_ функций поправили.

 

            for (int i = 10; i > 0; i--)
            {
                for (int i = 5; i > 0; i--)
                {

                }
            }

В C# подругому:

A local or parameter named 'i' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter

И это правильно. Лень проверять в С++, но думаю там также как в С#

[Удален]  
Ага, особенно сразу после внутренного цикла чему равно i не совсем ожидаемо
 

Лень проверять в С++, но думаю там также как в С#

В С++ ошибки компиляции или предупреждения нет, то есть такой код спокойно компилируется. В общем, в разных языках на это смотрят по-разному. Мне тоже ближе позиция, что так код писать не надо, то есть нежелательно разрешать использовать одинаковые имена внутри нескольких вложенных областей видимости в пределах одной функции.