Ошибки, баги, вопросы - страница 3337
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Попробуйте вставить такую строку в метод CCheckGroup::Check() в файле CheckGroup.mqh:
На экране будет отображаться количество объектов CCheckBox в массиве m_rows и индекс idx, передаваемый в метод, по которому предполагается доступ в объекту в массиве.
Если при некоем условии индекс больше, либо равен количеству объектов в массиве, то тут и получается выход за пределы массиваСоответственно, будет от чего отталкиваться для поиска и исправления ошибки в такой ситуации.
Спасибо за ответ!
Да, я уже посмотрел файлы СБ, и в том и дело, что в CheckGroup.mqh массив m_rows
еще при создании группы принудительно урезается до числа видимых в окне чек-боксов
(строка 106, метод CCheckGroup::Create(...) - ArrayResize(m_rows,m_total_view);,
а при скроллинге на графике в каждый момент присутствуют только объекты,
соответствующие видимым чек-боксам.
Поэтому при обращении за пределы окна гарантированно получим out of range.
Просто думал, что полностью понять их алгоритм не могу, поэтому надеялся,
что где-то моя ошибка...
Но вот воспроизвел этот эффект и в советнике Controls.mq5 из раздела примеров
в стандартной поставке терминала, из папки:
...\MQL5\Experts\Examples\Controls
Там если во включаемом файле ControlsDialog.mqh в методе CControlsDialog::CreateCheckGroup(void)
дополнить код, и создать не 5, а 8 чек-боксов
и затем выбрать програмно шестой, то после компиляции - тот же out of range
С макросами ещё одна штука есть, с кривой их подсветкой.
Макрос в ME подсвечивается только ниже той строки, в которой он был определён, вроде правильно.
Но макросы из включаемого файла подсвечиваются во включающем тоже только после той строки, где определены во включаемом, а не где он включается.
Получается, сдвинул макрос для лучшей читабельности и получил другой результат? Столь замечательный нюанс полезным не видится.
А что мешает все такие макросы со смысловым переносом (MACRO1) определить один через другой и использовать в дальнейшем (сдвигать для удобства) уже другой (MACRO2) :
Это также как и с дополнительными скобками () в макросах - можно их и не использовать (и компилятор не добавляет их сам), но тогда будьте готовы к сюрпризам
Нужно реализовать смысловой перенос - переопределите макрос и используйте его синоним
Не нужен смысловой перенос - делайте как обычно
Даже Стилизатор понимает, что #define не нужно трогать
Было:
Стало:
Большая просьба к разработчикам.
В тестере на графике Balance/Equity очень не хватает самой цены тестируемого периода, синхронизированной по трейдам.
Было бы очень полезно при анализе слабых и сильных мест в стратегии. Пусть будет очень бледной, едва заметной. Это ведь совсем не сложно реализовать.
Например так:
Спасибо за ответ!
Да, я уже посмотрел файлы СБ, и в том и дело, что в CheckGroup.mqh массив m_rows
еще при создании группы принудительно урезается до числа видимых в окне чек-боксов
(строка 106, метод CCheckGroup::Create(...) - ArrayResize(m_rows,m_total_view);,
а при скроллинге на графике в каждый момент присутствуют только объекты,
соответствующие видимым чек-боксам.
Поэтому при обращении за пределы окна гарантированно получим out of range.
Просто думал, что полностью понять их алгоритм не могу, поэтому надеялся,
что где-то моя ошибка...
Но вот воспроизвел этот эффект и в советнике Controls.mq5 из раздела примеров
в стандартной поставке терминала, из папки:
...\MQL5\Experts\Examples\Controls
Там если во включаемом файле ControlsDialog.mqh в методе CControlsDialog::CreateCheckGroup(void)
дополнить код, и создать не 5, а 8 чек-боксов
и затем выбрать програмно шестой, то после компиляции - тот же out of range
Для приватного m_total_view нет метода, возвращающего его значение. Значит, нужно либо исправлять сам класс в СБ (и делать это с каждым обновлением терминала), либо скопировать класс себе под другим именем и там поправить - сделать контроль видимых чекбоксов при попытке поставить галку на невидимом
Можете предоставить минимальный код, воспроизводящий описанный баг? Чтобы можно было скомпилировать и запустить.
А что мешает...
Да и так нормально:
Я вел речь не про обходные костыли, а про появление дополнительных потенциальных ошибок практически на ровном месте (нет примера пользы).
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления
Slava, 2023.02.15 09:10
Не все фичи C++ реализованы. Некоторые реализованы с ошибкой.
Но в данном случае, с высоты 30-летнего опыта программирования на C++, я бы сказал: "не надо так делать". Это - путь к трудноуловимым ошибкам.
Позиция слепого следования стандартам чужого языка ради совместимости с кодом говно-кодеров этого языка - отказ от собственного опыта ради занудства. Не сомневаюсь, что обсуждаемая хрень будет реализована разработчиками. Только ради галочки совместимости, конечно.
Я вел речь не про обходные костыли, а про появление дополнительных потенциальных ошибок практически на ровном месте (нет примера пользы).
Позиция слепого следования стандартам чужого языка ради совместимости с кодом говно-кодеров этого языка - отказ от собственного опыта ради занудства.
Польза очевидна: 99% пользователей изучивших Документацию MQL (а не только избранный круг посвященных), а также все пользователи C\C++ будут одинаково понимать совместимый код
Польза многократна: код написанный C\C++ в будет работать и в MQL и наоборот
У меня нет требования, чтобы все возможности C++ были реализованы в MQL, но те, которые реализованы, а тем более описаны в MQL Документации - должны работать без ошибок
Если Вы считаете, что ошибки нет, то докажите это конкретным примером, а не общими рассуждениями
Действую не по стандартам чужого языка, а строго по Документации MQL: разбиваю длинный макрос обратным слешем на несколько строк - как это указано в Документации именно MQL: Если запись директивы получается слишком большой, то её можно разбить на несколько строк с помощью обратного слеша '\', в таком случае следующая строка будет считаться продолжением записи директивы.
#define MACRO qwertyuiop asdfghjkl zxcvbnm#define MACRO qwertyuiop\ asdfg\hjkl zxcvbnmРезультат:
#define MACRO qwertyuiop\ asdfg\ hjkl zxcvbnmЧто может быть проще для понимания?
Это не компилятор делает - это Вы сами должны разбить длинный макрос на несколько строк
Действуйте строго по Документации и тогда не будет никаких, даже потенциальных ошибок