Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе - страница 31

 
Alexey Viktorov #:

А какие сомнения? Всё правильно, ведь ii1[] = {0}; инициализируется одним значением, соответственно размер массива фиксированный = 1

Если написать так ii1[] = {0, 0}; то будет фиксированный массив размером 2 элемента.

Тогда для чего исправляли чтобы массив при инициализации  

ii1[] = {};


оставался динамическим? Это несовпадение поведения при одинаковых условиях, и зачем если можно было писать так: 

ii1[];

Из справки:

Инициализация переменных

Если размер инициализируемого массива не указан, то он определяется компилятором, исходя из размера инициализирующей последовательности.

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

 
Aliaksandr Hryshyn #:

Тогда для чего исправляли чтобы массив при инициализации  


оставался динамическим? Это несовпадение поведения при одинаковых условиях, и зачем если можно было писать так: 

Из справки:

Инициализация переменных

Если размер инициализируемого массива не указан, то он определяется компилятором, исходя из размера инициализирующей последовательности.

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

ii1[] = {};

Такая запись меня тоже удивляет, зачем? Но, видимо это на любителя, кто как привык… И тем не менее, это не должно превращать динамический массив в статический…

 
Alexey Viktorov #:

Такая запись меня тоже удивляет, зачем? Но, видимо это на любителя, кто как привык… И тем не менее, это не должно превращать динамический массив в статический…

Почему не должно? Всё согласно справке. Зачем тут двойственность поведения компилятора? Язык MQL двигался в сторону ужесточения контроля написания кода, раньше вообще можно было заполнять массив без предварительного изменения его размера, всё происходило автоматически.

 
Aliaksandr Hryshyn #:

Почему не должно? Всё согласно справке. Зачем тут двойственность поведения компилятора? Язык MQL двигался в сторону ужесточения контроля написания кода, раньше вообще можно было заполнять массив без предварительного изменения его размера, всё происходило автоматически.

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

Может разработчики более доступно объяснят. У меня догадок не хватает…

 
Aliaksandr Hryshyn #:

https://www.mql5.com/ru/forum/380278/page28#comment_26154900

https://www.mql5.com/ru/forum/380278/page28#comment_26161754

Спустя 2 обновления:

Интересует массив ii1[], тут именно инициализация массива конкретными значениями

Все верно - вы своей явной инициализирующей последовательностью сами заявили/переопределили ii1 как фиксированный массив.

{0} для динамического массива превращает определение массива в фиксированное из 1 элемента.

{} для динамического массива не имеет смысла/бесполезно и фактически пропускается. Мы убрали явное преобразование(по факту убийство) динамического массива с {} в статический размером 0 элементов. Хотя я бы лучше оставил - это быстрее бы обучило не делать глупостей в коде.

 
tyup #:

Уважаемые разработчики, при обновлении до  3121 появилась проблема

Вот такой эксперт 

При тестировании

Спасибо за пример, разберемся.

 
Aliaksandr Hryshyn #:

Тогда для чего исправляли чтобы массив при инициализации

А какой смысл от пустого статического массива?

 
Andrei Trukhanovich #:

А какой смысл от пустого статического массива?

Renat Fatkhullin #:

... Хотя я бы лучше оставил - это быстрее бы обучило не делать глупостей в коде.

 
Aliaksandr Hryshyn #:

Я так понимаю ответа на свой вопрос я не дождусь )

 

Есть простой скрипт

void OnStart()
{
  ushort Item,Array[];
  Print(sizeof(Item));
  Print(sizeof(Array[0]));
}

Будучи собранный старой релизной версией 2940 он выдаёт результат 2 2, как и ожидается.

Будучи собранный последней релизной версией 3091 он выдаёт результат 2 4.

Почему?

Причина обращения: