Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0.
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически управляются исполняющей подсистемой терминала.
Если в программе необходимо самостоятельно управлять памятью в сложных динамических условиях, то функция ArrayFree() позволит явным образом и немедленно освобождать память, занятую ненужным уже динамическим массивом.
Понимаете? Ненужным.
Естественно, что раз память от него освобождена, а потом вы её опять распределили при помощи задания размера массиву, то никто вам не гарантирует его содержимое.
Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?
Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?
ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".
Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.
2 стиля? Я и не знал про стили. Просто ранее можно было делать этот участок только так. Изменения произошли. Я более 10 лет программил на MQL4. А теперь разработчики поменяли язык и многие коды мои перестали работать. Я сильно разочарован. Не к лучшему произошли изменения. Это значит, что теперь мне туеву кучу кодов переделывать. Они хоть и старые, а пользы от них было на цельный вагон.
А разве не вот так код стрелки задавался до введения в mql4 ObjectSetXXX-функций?
Я тоже уже порядка 10 лет (может и больше - как время летит...) пишу на mql - уже подзабывать начинаю сугубо четвёрочные функции - пишу по возможности мультиплатформенный код.
Тогда почему цифровые значения "мусора" константы, даже после перезагрузки терминала?
Лично я погорел на простом суммировании содержания ячеек другого массива, и долго ломал голову в чем беда
Не имеет значения, какие именно данные содержатся в неинициализированном массиве, в любой момент, данные могут поменяться, их значение никто не гарантирует. Именно поэтому использование неинициализированных переменных (читать памяти) иногда приводит к ситуациям, с долгим поиском причины:
Могу лишь дать совет. Необходимо вырабатывать привычку, всегда инициализировать данные, чтобы в будущем не тратить кучу времени на поиск ошибок связанных с отсутствием инициализации.
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?
Что значит "нет" ? Никто у вас планку памяти не вынимает из слота в материнской плате. А раз память присутствует, и она освобождена (не инициализирована значением, а именно освобождена), то она начинает использоваться под иные нужды программы.
Не имеет значения, какие именно данные содержатся в неинициализированном массиве, в любой момент, данные могут поменяться, их значение никто не гарантирует. Именно поэтому использование неинициализированных переменных (читать памяти) иногда приводит к ситуациям, с долгим поиском причины:
Могу лишь дать совет. Необходимо вырабатывать привычку, всегда инициализировать данные, чтобы в будущем не тратить кучу времени на поиск ошибок связанных с отсутствием инициализации.
ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".
Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.
не правильное объяснение из-за чего у новичков могут возникнуть проблемы, в справке по ArrayResize есть правильное объяснение
по сути новичкам нужно сперва понять что такое массив и как он располагается в памяти, как он создается и как распределяется под него память, тогда и вопросов не будет ни каких
ps. вообще реализация массивов в MQL5 хуже чем чем в С++ так же как и структур, если с последними еще как то можно в большинстве случаем мириться, то из-за моссивов приходится писать врапперы
в простых программах реализация массивов удачная, в сложных становится определенной проблемой
Что значит "нет" ? Никто у вас планку памяти не вынимает из слота в материнской плате. А раз память присутствует, и она освобождена (не инициализирована значением, а именно освобождена), то она начинает использоваться под иные нужды программы.
Память, это сохраненная информация, а не носитель информации, которым является планка ОЗУ.
Я не знал, что память не забивается нулями, а лишь освобождаются/выделяются адреса для её хранения и нужно самому организовывать зачистку.
Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0.
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически управляются исполняющей подсистемой терминала.
Если в программе необходимо самостоятельно управлять памятью в сложных динамических условиях, то функция ArrayFree() позволит явным образом и немедленно освобождать память, занятую ненужным уже динамическим массивом.
Понимаете? Ненужным.
Естественно, что раз память от него освобождена, а потом вы её опять распределили при помощи задания размера массиву, то никто вам не гарантирует его содержимое.
Используйте инициализацию массива: ArrayInitialize()
Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?
Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?
ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".
Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.
Спасибо, помогло.
2 стиля? Я и не знал про стили. Просто ранее можно было делать этот участок только так. Изменения произошли. Я более 10 лет программил на MQL4. А теперь разработчики поменяли язык и многие коды мои перестали работать. Я сильно разочарован. Не к лучшему произошли изменения. Это значит, что теперь мне туеву кучу кодов переделывать. Они хоть и старые, а пользы от них было на цельный вагон.
А разве не вот так код стрелки задавался до введения в mql4 ObjectSetXXX-функций?
Я тоже уже порядка 10 лет (может и больше - как время летит...) пишу на mql - уже подзабывать начинаю сугубо четвёрочные функции - пишу по возможности мультиплатформенный код.
ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".
Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.
Тогда почему цифровые значения "мусора" константы, даже после перезагрузки терминала?
Лично я погорел на простом суммировании содержания ячеек другого массива, и долго ломал голову в чем беда
Тогда почему цифровые значения "мусора" константы, даже после перезагрузки терминала?
Лично я погорел на простом суммировании содержания ячеек другого массива, и долго ломал голову в чем беда
Не имеет значения, какие именно данные содержатся в неинициализированном массиве, в любой момент, данные могут поменяться, их значение никто не гарантирует.
Именно поэтому использование неинициализированных переменных (читать памяти) иногда приводит к ситуациям, с долгим поиском причины:
Могу лишь дать совет.
Необходимо вырабатывать привычку, всегда инициализировать данные, чтобы в будущем не тратить кучу времени на поиск ошибок связанных с отсутствием инициализации.
Что значит никто не гарантирует содержимое? Если память была освобождена, то её уже нет, тогда каким боком берется мусор в ней? Или очистка памяти подразумевает дачу разрешения на использование этой памяти другой части программы, а вовсе не очистку по факту?
Что значит "нет" ? Никто у вас планку памяти не вынимает из слота в материнской плате. А раз память присутствует, и она освобождена (не инициализирована значением, а именно освобождена), то она начинает использоваться под иные нужды программы.
Не имеет значения, какие именно данные содержатся в неинициализированном массиве, в любой момент, данные могут поменяться, их значение никто не гарантирует.
Именно поэтому использование неинициализированных переменных (читать памяти) иногда приводит к ситуациям, с долгим поиском причины:
Могу лишь дать совет.
Необходимо вырабатывать привычку, всегда инициализировать данные, чтобы в будущем не тратить кучу времени на поиск ошибок связанных с отсутствием инициализации.
Спасибо за разъяснения и совет.
ArrayResize не занимается зачисткой памяти, поэтому в ней и содержится мусор, от предыдущего "потребителя".
Это сделано для скорости, т.к. после выделения памяти массиву, в 99.99(9)% случаях пользователь будет "наполнять" её своими данными.
не правильное объяснение из-за чего у новичков могут возникнуть проблемы, в справке по ArrayResize есть правильное объяснение
по сути новичкам нужно сперва понять что такое массив и как он располагается в памяти, как он создается и как распределяется под него память, тогда и вопросов не будет ни каких
ps. вообще реализация массивов в MQL5 хуже чем чем в С++ так же как и структур, если с последними еще как то можно в большинстве случаем мириться, то из-за моссивов приходится писать врапперы
в простых программах реализация массивов удачная, в сложных становится определенной проблемой
Что значит "нет" ? Никто у вас планку памяти не вынимает из слота в материнской плате. А раз память присутствует, и она освобождена (не инициализирована значением, а именно освобождена), то она начинает использоваться под иные нужды программы.
Память, это сохраненная информация, а не носитель информации, которым является планка ОЗУ.
Я не знал, что память не забивается нулями, а лишь освобождаются/выделяются адреса для её хранения и нужно самому организовывать зачистку.
Спасибо.Давно заметил, что криво работает поиск брокеров/торговых серверов при открытии демо-счета через Терминал.
Ввожу название брокера и ничего не получаю
Только если ввести полное имя торгового сервера, получается нужный результат