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

 
Artyom Trishkin #:

Попробуйте вставить такую строку в метод 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

//--- fill out with strings
   for(int i=0;i<8;i++)
      if(!m_check_group.AddItem("Item "+IntegerToString(i),1<<i))
         return(false);
   m_check_group.Check(0,1<<0); // OK
   m_check_group.Check(6,1<<6); // !!!
//--- succeed
Выходит, все же баг?
Что печально...

 

С макросами ещё одна штука есть, с кривой их подсветкой.

Макрос в ME подсвечивается только ниже той строки, в которой он был определён, вроде правильно.

Но макросы из включаемого файла подсвечиваются во включающем тоже только после той строки, где определены во включаемом, а не где он включается.

 
fxsaber #:
Получается, сдвинул макрос для лучшей читабельности и получил другой результат? Столь замечательный нюанс полезным не видится.

А что мешает все такие макросы со смысловым переносом (MACRO1) определить один через другой и использовать в дальнейшем (сдвигать для удобства) уже другой (MACRO2) :

#define MACRO1 unsigned\
int
#define MACRO2    MACRO1

#ifdef __MQL5__
  #define MACRO3    MACRO2
#endif

Это также как и с дополнительными скобками () в макросах - можно их и не использовать (и компилятор не добавляет их сам), но тогда будьте готовы к сюрпризам

Нужно реализовать смысловой перенос - переопределите макрос и используйте его синоним

Не нужен смысловой перенос - делайте как обычно

 
Да и так нормально:
#ifdef __MQL5__
  #define MACRO unsigned\
int
#endif

Даже Стилизатор понимает, что #define не нужно трогать

Было:

void OnStart()
{
        if(1);
#define MACRO1 unsigned\
int
else
   ;
}

Стало:

void OnStart()
{
   if(1);
#define MACRO1 unsigned\
int
   else
      ;
}
 

Большая просьба к разработчикам.
В тестере на графике Balance/Equity очень не хватает самой цены тестируемого периода, синхронизированной по трейдам.
Было бы очень полезно при анализе слабых и сильных мест в стратегии. Пусть будет очень бледной, едва заметной. Это ведь совсем не сложно реализовать. 
Например так:


 
44ex #:

Спасибо за ответ!

Да, я уже посмотрел файлы СБ, и в том и дело, что в 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 нет метода, возвращающего его значение. Значит, нужно либо исправлять сам класс в СБ (и делать это с каждым обновлением терминала), либо скопировать класс себе под другим именем и там поправить - сделать контроль видимых чекбоксов при попытке поставить галку на невидимом

 
44ex #:
Столкнулся с непонятной особенностью CChekGroup.

Если создать группу чек-боксов, например, из 20 items,
которая не помещается целиком в окошко на панели CAppDialog,
то естественным образом возникает полоса прокрутки,
и все корректно работает при действиях мышкой.

Однако если програмно поставить галку в боксе, который
находится за пределами окна, то это вызывает ошибку на этапе исполнения:

array out of range in 'CheckGroup.mqh' (222,17)

При этом боксы в пределах окна прекрасно чекаются програмно,
то есть галка появляется, и никаких ошибок...

m_check_group.Check(i,1<<i); где i - номер бокса

Подскажите, плиз, в чем может быть дело?

Можете предоставить минимальный код, воспроизводящий описанный баг? Чтобы можно было скомпилировать и запустить.

 
Я предполагаю, что в коде Dialog.mqh есть ошибка. Проблема была описана здесь https://www.mql5.com/en/forum/449129
Dialog takes always close event
Dialog takes always close event
  • 2023.06.16
  • www.mql5.com
Hi, the minimal example shown here is an AppDialog with a Button which should create a separate Dialog with a second Button...
 
A100 #:

А что мешает...

A100 #:
Да и так нормально:

Я вел речь не про обходные костыли, а про появление дополнительных потенциальных ошибок практически на ровном месте (нет примера пользы).

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

Slava, 2023.02.15 09:10

Не все фичи C++ реализованы. Некоторые реализованы с ошибкой.

Но в данном случае, с высоты 30-летнего опыта программирования на C++, я бы сказал: "не надо так делать". Это - путь к трудноуловимым ошибкам.



Позиция слепого следования стандартам чужого языка ради совместимости с кодом говно-кодеров этого языка - отказ от собственного опыта ради занудства. Не сомневаюсь, что обсуждаемая хрень будет реализована разработчиками. Только ради галочки совместимости, конечно.

 
fxsaber #:

Я вел речь не про обходные костыли, а про появление дополнительных потенциальных ошибок практически на ровном месте (нет примера пользы).

Позиция слепого следования стандартам чужого языка ради совместимости с кодом говно-кодеров этого языка - отказ от собственного опыта ради занудства.

Польза очевидна: 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

Что может быть проще для понимания?

Это не компилятор делает - это Вы сами должны разбить длинный макрос на несколько строк

Действуйте строго по Документации и тогда не будет никаких, даже потенциальных ошибок