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

 
Artyom Trishkin:

Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0.

При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически управляются исполняющей подсистемой терминала.

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

Понимаете? Ненужным.

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

Используйте инициализацию массива: ArrayInitialize()

Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?

 
Aleksey Vyazmikin:

Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?

ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".

Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.


 
Vitaly Murlenko:

Спасибо, помогло.

2 стиля? Я и не знал про стили. Просто ранее можно было делать этот участок только так. Изменения произошли. Я более 10 лет программил на MQL4. А теперь разработчики поменяли язык и многие коды мои перестали работать. Я сильно разочарован. Не к лучшему произошли изменения. Это значит, что теперь мне туеву кучу кодов переделывать. Они хоть и старые, а пользы от них было на цельный вагон.

А разве не вот так код стрелки задавался до введения в mql4 ObjectSetXXX-функций?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

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

 
Ilyas:

ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".

Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.


Тогда почему цифровые значения "мусора" константы, даже после перезагрузки терминала?

Лично я погорел на простом суммировании содержания ячеек другого массива, и долго ломал голову в чем беда

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

Тогда почему цифровые значения "мусора" константы, даже после перезагрузки терминала?

Лично я погорел на простом суммировании содержания ячеек другого массива, и долго ломал голову в чем беда

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

  1. На одном компьютере работает, на другом нет
  2. В терминале работает, в тестере нет
  3. После обновления терминала/ОС программа стала вести себя по другому
  4. Добавил Print перестало работать
  5. и т.д.

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

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?

Что значит "нет" ? Никто у вас планку памяти не вынимает из слота в материнской плате. А раз память присутствует, и она освобождена (не инициализирована значением, а именно освобождена), то она начинает использоваться под иные нужды программы.

 
Ilyas:

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

  1. На одном компьютере работает, на другом нет
  2. В терминале работает, в тестере нет
  3. После обновления терминала/ОС программа стала вести себя по другому
  4. Добавил Print перестало работать
  5. и т.д.

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

Спасибо за разъяснения и совет.

 
Ilyas:

ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".

Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.


не правильное объяснение из-за чего у новичков могут возникнуть проблемы, в справке по ArrayResize  есть правильное объяснение

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

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

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

 
Artyom Trishkin:

Что значит "нет" ? Никто у вас планку памяти не вынимает из слота в материнской плате. А раз память присутствует, и она освобождена (не инициализирована значением, а именно освобождена), то она начинает использоваться под иные нужды программы.

Память, это сохраненная информация, а не носитель информации, которым является планка ОЗУ.

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

Спасибо.
 

Давно заметил, что криво работает поиск брокеров/торговых серверов при открытии демо-счета через Терминал.

Ввожу название брокера и ничего не получаю


Только если ввести полное имя торгового сервера, получается нужный результат