Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 599
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте!
Подскажите пожалуйста как перенести курсор ,скажем на 7 строчку в текстовом документе,для извлечения подстроки уже с этой позиции...
Что будет быстрее-много текстовых файлов с одной строкой или один файл с большим количеством строк?
Нужно знать сколько байт в одной строке и переместить указатель на 6 таких значений от начала файла.
Здравствуйте!
Что будет быстрее-много текстовых файлов с одной строкой или один файл с большим количеством строк?
Зависит от конкретной реализации алгоритма и задачи, которую нужно решить. Возможно в Вашем случае будет быстрее первый вариант, но о производительности я бы на Вашем месте пока не задумывался.
Подскажите пожалуйста как перенести курсор ,скажем на 7 строчку в текстовом документе,для извлечения подстроки уже с этой позиции...
Читайте стандартную документацию. Раздел "Файловые операции". Например можно построчно считать файл с помощью FileReadString, пример прямо из документации:
Подскажите, как конвертировать значение нажатия кнопки мыши на графике в значение цены или наоборот.
Подскажите, как конвертировать значение нажатия кнопки мыши на графике в значение цены или наоборот.
Используйте функцию ChartXYToTimePrice. См. раздел "Операции с графиками" в документации.
Используйте функцию ChartXYToTimePrice. См. раздел "Операции с графиками" в документации.
Благодарю.
Значит накосячили с CArrayObj. Вместо: CArrayObj test_objects; Написали: CArrayObj* test_objects, а диструктор для него забыли сделать; Возможно неправильно сконфигурировали модель памяти по работе с CArrayObj. Может просто с указателями перемудрили. Диагноз однозначный: использование указателей там, где они не нужны, часто приводит к утечкам.
Есть функция в каком-то классе. В ней я объявляю массив объектов CArrayObj. В него добавляю глобальные объекты класса. Закончилась функция, сам массив объектов не нужен. Объекты, разумеется, нужны.
Если я создаю массив как указатель CArrayObj *test_objects, то потом получаю undeleted objects в логе, что приведет в конце концов к ошибке out of memory.
Если я объявляю массив так CArrayObj test_objects, добавляю в него объекты, то получается по окончании действия функции и объекты станут недоступны, т.к. массив с объектами как бы удалился...
Если я объявляю массив так CArrayObj test_objects, добавляю в него объекты, то получается по окончании действия функции и объекты станут недоступны, т.к. массив с объектами как бы удалился...
Все правильно, потому что в этом случае вы размещаете CArrayObj test_objects на стеке, а адресном пространстве функции. Когда происходит выход из функции, адресное пространство функции затирается, включая и Ваш CArrayObj test_objects.
Закончилась функция, сам массив объектов не нужен. Объекты, разумеется, нужны.
Запомните раз и навсегда - если нужны объекты внутри CArrayObj, то и сам CArrayObj нужен. CArrayObj обязательная упаковка. Без него никак, точка.
Если я создаю массив как указатель CArrayObj *test_objects, то потом получаю undeleted objects в логе, что приведет в конце концов к ошибке out of memory.
В этом случае создается указатель на некий объект CArrayObj в куче. Куча - это сегмент памяти адресного пространства программы, выделение и удаление памяти в которой происходит вручную, с помощью соответствующих операторов new и delete. Это значит что если Вы пишите new, то обязательно где-то должен быть зеркальный близнец delete. При том new и delete могут располагаться в разных частях программы, например в разных методах:
Если и после вызова foo_analize объекты по-прежнему нужны, то оператор delete можно перенести в другое место, при достижении которого объекты гарантированно становятся ну нужными. Таким универсальным местом может быть OnDeinit например, который вызывается перед закрытием программы.
Запомните главное, если есть оператор new, всегда должен быть оператор delete для него. В противном случае будут утечки памяти. Операторы new и delete работающие с одним и тем же объектом не обязательно должны располагаться в одном методе "рядом". Delete может быть где угодно далеко от места выделения памяти, главное, что бы у delete была ссылка на выделенный объект в куче.
** Замечу что сказанное хотя и является верным, лучше избегать подобных конструкций, т.к. всегда приходится очень внимательно смотреть где и при каких обстоятельствах вызывать оператор delete, что не всегда является очевидным. Вместо этого нужно просто научиться использовать классы. Класс позволяет автоматически размешать и удалять объекты на куче, без использования операторов new и delete:
Данный класс не содержит указателей в явном виде. Значит не нужно использовать как new так и delete. После выхода из программы, класс освободит все объекты CItem и CArrayObj автоматически, что здорово упрощает жизнь разработчику.
Все правильно, потому что в этом случае вы размещаете CArrayObj test_objects на стеке, а адресном пространстве функции. Когда происходит выход из функции, адресное пространство функции затирается, включая и Ваш CArrayObj test_objects.
Запомните раз и навсегда - если нужны объекты внутри CArrayObj, то и сам CArrayObj нужен. CArrayObj обязательная упаковка. Без него никак, точка.
В этом случае создается указатель на некий объект CArrayObj в куче. Куча - это сегмент памяти адресного пространства программы, выделение и удаление памяти в которой происходит вручную, с помощью соответствующих операторов new и delete. Это значит что если Вы пишите new, то обязательно где-то должен быть зеркальный близнец delete. При том new и delete могут располагаться в разных частях программы, например в разных методах:
Если и после вызова foo_analize объекты по-прежнему нужны, то оператор delete можно перенести в другое место, при достижении которого объекты гарантированно становятся ну нужными. Таким универсальным местом может быть OnDeinit например, который вызывается перед закрытием программы.
Запомните главное, если есть оператор new, всегда должен быть оператор delete для него. В противном случае будут утечки памяти. Операторы new и delete работающие с одним и тем же объектом не обязательно должны располагаться в одном методе "рядом". Delete может быть где угодно далеко от места выделения памяти, главное, что бы у delete была ссылка на выделенный объект в куче.
** Замечу что сказанное хотя и является верным, лучше избегать подобных конструкций, т.к. всегда приходится очень внимательно смотреть где и при каких обстоятельствах вызывать оператор delete, что не всегда является очевидным. Вместо этого нужно просто научиться использовать классы. Класс позволяет автоматически размешать и удалять объекты на куче, без использования операторов new и delete:
Данный класс не содержит указателей в явном виде. Значит не нужно использовать как new так и delete. После выхода из программы, класс освободит все объекты CItem и CArrayObj автоматически, что здорово упрощает жизнь разработчику.
Спасибо. Только что-то на мой конкретно вопрос я не нашёл ответа. Куда мне delete поместить, если я объявляю указатель. Повторяю объект CArrayObj объявляется в функции... как я могу его удалять в Deinit()?
Но предварительно я решил проблему вот так. Перед завершением функции:
Спасибо. Только что-то на мой конкретно вопрос я не нашёл ответа. Куда мне delete поместить, если я объявляю указатель. Повторяю объект CArrayObj объявляется в функции... как я могу его удалять в Deinit()?
Здесь не клуб телепатов. Свой код Вы не приложили, поэтому о том, где размещать delete, думайте сами.
Неправильно.