Принудительная очистка массивов в МТ5? - страница 2

 
Artyom Trishkin:

Конечно же нужно.

Любой уважающий себя и свои программы программист не пустит всё на самотёк. В MQL4, если не использовать #property strict, то можно обратиться к массиву с размером 10 по индексу 20. И ничего не будет - программа продолжит работать, но вот ЧТО там программист возьмёт и будет далее использовать - это лежит на его плечах. Если он с головой, то обязательно всё будет проверять и контролировать, дабы не получать значения за пределами массива, но если он "тяп-ляп", то он не заморачивается таким контролем, и "главное, что работает, а как - ну уж как-нить...".
В большинстве своём как раз-таки взвыли именно такие юзеры - кто ничем не заморачивался, и они теперь хают "плохой, злой и сложный MQL5", потому, что он им не даёт как раньше тяпляпать свои поделки. А вот те, кто изначально думал и делал код с проверками и контролем получаемых данных, тот и не заметил никакой разности в сложности языков, и теперь недоумевает - "где ж там сложность-то - всё так же..."

что и делить на ноль без #property strict разрешено и при этом планета не коллапсирует в чёрную дыру, а ведь так хочется иногда поделить на ноль, да вот не дают
 
Алексей Тарабанов:

Николай, не переживайте за МQL4,там все хорошо. Топикстартер заполняет массивы как попало. Все. 

Artyom Trishkin:

Конечно же нужно.

Любой уважающий себя и свои программы программист не пустит всё на самотёк. В MQL4, если не использовать #property strict, то можно обратиться к массиву с размером 10 по индексу 20. И ничего не будет - программа продолжит работать, но вот ЧТО там программист возьмёт и будет далее использовать - это лежит на его плечах. Если он с головой, то обязательно всё будет проверять и контролировать, дабы не получать значения за пределами массива, но если он "тяп-ляп", то он не заморачивается таким контролем, и "главное, что работает, а как - ну уж как-нить...".
В большинстве своём как раз-таки взвыли именно такие юзеры - кто ничем не заморачивался, и они теперь хают "плохой, злой и сложный MQL5", потому, что он им не даёт как раньше тяпляпать свои поделки. А вот те, кто изначально думал и делал код с проверками и контролем получаемых данных, тот и не заметил никакой разности в сложности языков, и теперь недоумевает - "где ж там сложность-то - всё так же..."

Жесть!
Ну что, Петр, благодаря строгости MQL5 есть шанс привести код в относительный порядок и разобрать завалы мусора. 
Можно даже после попробовать пофиксенный код обратно на MQL4 откомпилировать с #property strict и возможно он будет заметно быстрее работать и на MT4

 
Nikolai Semko:

Жесть!
Ну что, Петр, благодаря строгости MQL5 есть шанс привести код в относительный порядок и разобрать завалы мусора. 
Можно даже после попробовать пофиксенный код обратно на MQL4 откомпилировать с #property strict и возможно он будет заметно быстрее работать и на MT4

Вот так, априори, ты решил что у меня в коде завалы мусора.

Поясняю: ядро заполняется поэтапно, в несколько заходов. Если при объявлении массива в МТ5 в нем мусор (чего я не знал), то на первых этапах построения ядра в функциях, происходит выход за пределы массива, потому что вместо указателей на переменные, я ссылаюсь на одну ячейку ядра через другую. Если в ней ноль, то ничего страшного, и во втором заходе она получает нужное значение, а если в ней мусор, то происходит критическая ошибка.

Так тебе понятно?

 
Nikolai Semko:
Петр, не понимаю, о чем ты?
...

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

 
...
Если происходит у тебя переполнения, то ищи у себя ошибки.
 И если есть мусор, это твой мусор, который ты не убрал.

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

Все это из за мусора в объявляемом массиве. 

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

 
Реter Konow:

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

А нука создайте монолог - ещё 10 сообщений подряд.

 
Реter Konow:

Вот так, априори, ты решил что у меня в коде завалы мусора.

Поясняю: ядро заполняется поэтапно, в несколько заходов. Если при объявлении массива в МТ5 в нем мусор (чего я не знал), то на первых этапах построения ядра в функциях, происходит выход за пределы массива, потому что вместо указателей на переменные, я ссылаюсь на одну ячейку ядра через другую. Если в ней ноль, то ничего страшного, и во втором заходе она получает нужное значение, а если в ней мусор, то происходит критическая ошибка.

Так тебе понятно?

Реter это совсем не так. Не мусор виноват, а отсутствие #property strict в mql4. Без этого прибамбаса вместо выхода за пределы массива получаешь 0, а в mql5 уже критическая ошибка. Наверное лучше проверять длину массива вместо содержимого несуществующего индекса  массива.

 
Alexey Viktorov:

Реter это совсем не так. Не мусор виноват, а отсутствие #property strict в mql4. Без этого прибамбаса вместо выхода за пределы массива получаешь 0, а в mql5 уже критическая ошибка. Наверное лучше проверять длину массива вместо содержимого несуществующего индекса  массива.

Выход за пределы происходит потому что в указывающей ячейке мусор.

Например:

G_CORE[Объект][Канвас] = G_CORE[Окно][Его_канвас];

Изначально:

G_CORE[Объект][Канвас] = -123423452345; (мусор)

G_CORE[Окно][Его_канвас] = -452345;     (мусор)

//-----------------------------------------------------------------

Результат - выход за пределы массива.

Повторю. На первом этапе заполнения ядра некоторые ячейки имеют нулевые значения в МТ4 и заполняются на втором круге. 

В МТ5, из за мусора в ячейках, на первом круге происходит критическая ошибка.

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

 

Вот более точный пример:

Первый круг построения ядра. В одной из функций:

int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];

Если G_CORE[Окно][Его_канвас] = 234523452345; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0; Ошибки нет, и ядро продолжает нормально строится.
 
Реter Konow:

Выход за пределы происходит потому что в указывающей ячейке мусор.

Например:

Изначально:

G_CORE[Объект][Канвас] = -123423452345; (мусор)

G_CORE[Окно][Его_канвас] = -452345;     (мусор)

//-----------------------------------------------------------------

Результат - выход за пределы массива.

Повторю. На первом этапе заполнения ядра некоторые ячейки имеют нулевые значения в МТ4 и заполняются на втором круге. 

В МТ5, из за мусора в ячейках, на первом круге происходит критическая ошибка.

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

Неинициализация массива - это целиком и полностью вина кодопистаеля. Ищите ошибки у себя. Перестраивайте свой алгоритм.