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

 

Никогда серьезно не работал с МТ5, а сейчас перевожу на него сразу огромный проект. Естественно, возникают трудности, одна из которых - постоянный выход за пределы массива. В МТ4 такой проблемы не было, как оказывается еще и потому, что массивы не нужно было специально очищать после объявления. А в МТ5 это необходимо. Моя технология требует постепенного заполнения ядра вместе с изменением его размера. Заранее точный размер некоторых массивов неизвестен. При этом, из за большого количества циклов по массивам в процессе их заполнения, происходит выход за пределы.  Если бы в ячейках небыло мусора, все давно бы работало.  

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

Хочу понять, зачем нужно было убирать автоматическую очитку массивов, вместе с приведением объявленных переменых к нулю, как в МТ4? 

Если с переменными еще можно мириться, то постоянно натыкаться на проблемы мусора в больших массивах и самостоятельно заботится об их очистке не только при объявлении, но и при изменении размеров... Зачем?

 

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

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

 
Ладно, не будем жаловаться. )) Просто нужно привыкнуть.))
 

Привыкните.

Я всегда объявляю массив, ставлю размер ожидаемый, заполняю его значениями (инициализирую). Инициализировать часто лучше не нулем - так легче бывает искать ошибку.

 
Петр, не понимаю, о чем ты?
Есть динамический массив, есть текущий размер этого массива, есть контроль переполнения. 
Лично я стараюсь уходить от контроля переполнения, а использовать его только на этапе разработки,  т.к. если алгоритм грамотный без ошибок, то переполнения не происходит. Зачем лишние проверки?
Если происходит у тебя переполнения, то ищи у себя ошибки. Отладчик с точками прерывания тебе в помощь или без точек прерывания, т.к. при переполнении программа останавливается в режиме отладки и ты можешь посмотреть переменные.
 И если есть мусор, это твой мусор, который ты не убрал.
 
Реter Konow:

Никогда серьезно не работал с МТ5, а сейчас перевожу на него сразу огромный проект. Естественно, возникают трудности, одна из которых - постоянный выход за пределы массива. В МТ4 такой проблемы не было, как оказывается еще и потому, что массивы не нужно было специально очищать после объявления. А в МТ5 это необходимо. Моя технология требует постепенного заполнения ядра вместе с изменением его размера. Заранее точный размер некоторых массивов неизвестен. При этом, из за большого количества циклов по массивам в процессе их заполнения, происходит выход за пределы.  Если бы в ячейках небыло мусора, все давно бы работало.  

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

Хочу понять, зачем нужно было убирать автоматическую очитку массивов, вместе с приведением объявленных переменых к нулю, как в МТ4? 

Если с переменными еще можно мириться, то постоянно натыкаться на проблемы мусора в больших массивах и самостоятельно заботится об их очистке не только при объявлении, но и при изменении размеров... Зачем?

Тоже сначала столкнулся с подобными трудностями.

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

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

все о том же https://www.mql5.com/ru/forum/293630/page179#comment_10802823

теперь MQL5 виноват... ;)

Мой подход. Ядро - Движок.
Мой подход. Ядро - Движок.
  • 2019.02.28
  • www.mql5.com
В этой ветке, я хочу рассказать о своем подходе в программировании. Заранее предупреждаю, - здесь не будет обсуждений GUI...
 
Igor Makanu:

все о том же https://www.mql5.com/ru/forum/293630/page179#comment_10802823

теперь MQL5 виноват... ;)

Ну да. Что-то я отвык от MQL4.
Что, правда, там не нужно контролировать переполнения? Но ведь это ужасно. Как ошибки вылавливать?
 
Nikolai Semko:
Ну да. Что-то я отвык от MQL4.
Что, правда, там не нужно контролировать переполнения? Но ведь это ужасно. Как ошибки вылавливать?

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

 
Nikolai Semko:
Ну да. Что-то я отвык от MQL4.
Что, правда, там не нужно контролировать переполнения? Но ведь это ужасно. Как ошибки вылавливать?

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

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

 
Реter Konow:

Никогда серьезно не работал с МТ5, а сейчас перевожу на него сразу огромный проект.

Серьезное отличие по массивам при переписывании

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

Особенности языка mql4, тонкости и приёмы работы

fxsaber, 2019.02.12 13:12

Особенности ArrayResize для многомерных массивов
void OnStart()
{
  int Array[][2];
  
  Print(ArrayResize(Array, 7)); // MQL5 - 7, MQL4 - 14
  Print(ArraySize(Array));      // 14
}
Причина обращения: