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

 
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 не совсем ожидаемо
 

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

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

Почти два года этому...

https://www.mql5.com/ru/forum/1111/page3491#comment_52301985

Считаю, что отсутствие предупреждения увеличивает вероятность ошибки в коде.

Запросите у брокера.
Запросите у брокера.
  • 2024.02.14
  • www.mql5.com
Точно помню что в 5-ке компилятор ругался на такую конструкцию. когда одна переменная может быть переопределена внутри внутренней зоны видимости с сохранением значения во внешней
 
Aleksandr Slavskii #:

Считаю, что отсутствие предупреждения увеличивает вероятность ошибки в коде.

Бывают ситуации, когда в макросах требуется такая возможность. Тогда такие предупреждения - зло.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2025.02.10 16:12

Ругался. Но теперь можно писать такое.


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

 
fxsaber #:
Бывают ситуации, когда в макросах требуется такая возможность. Тогда такие предупреждения - зло.
Считаю что лучшим вариантом было бы чтоб предупреждения были, но чтоб была возможность их отключать, как это реализовано в VS.