Ошибки, баги, вопросы - страница 3337
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
#define MACRO unsigned int
Не пойму тогда чего Вы добиваетесь...
Если нужно сделать такую запись:
#define MACRO такая \ запись
... то и будет "такая запись"
А если нужно сделать неразрывную запись:
#define MACRO не\ разрывная запись
... то и будет "неразрывная запись"
А в чём где ошибки?
А если нужно сделать неразрывную запись:
... то и будет "неразрывная запись"
А в чём где ошибки?
Попробуйте вставить такую строку в метод CCheckGroup::Check() в файле CheckGroup.mqh:
На экране будет отображаться количество объектов CCheckBox в массиве m_rows и индекс idx, передаваемый в метод, по которому предполагается доступ в объекту в массиве.
Если при некоем условии индекс больше, либо равен количеству объектов в массиве, то тут и получается выход за пределы массива.
Соответственно, будет от чего отталкиваться для поиска и исправления ошибки в такой ситуации.
Интуитивно для меня это вторая строка того же макроса - продолжение.
У меня нет представления, что любой макрос - это всегда одна строка после применения.
Макрос после применения это всегда одна строка, но если Вам недостаточно теории, то вот подтверждающий пример:
А в чём где ошибки?
Вот проще пример:
Компилятор не распознал abcdefg как единое целое
Макрос после применения это всегда одна строка, но если Вам недостаточно теории, то вот подтверждающий пример:
Получается, сдвинул макрос для лучшей читабельности и получил другой результат? Столь замечательный нюанс полезным не видится.
ЗЫ Предлагается такая запись?
А вот более удобное визуальное (сдвинул пробелами внутри ifdef/endif) вложение уже меняет результат?
Попробуйте вставить такую строку в метод 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) :
Это также как и с дополнительными скобками () в макросах - можно их и не использовать (и компилятор не добавляет их сам), но тогда будьте готовы к сюрпризам
Нужно реализовать смысловой перенос - переопределите макрос и используйте его синоним
Не нужен смысловой перенос - делайте как обычно