Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике - страница 44

 
Carl Schreiber:

He has re-installed everything with no success but a paid VPS: / Он переустановил все безуспешно, кроме платного VPS:

 

Upgrade to the latest Big Sur 11.2.1 and MetaTrader 5 build 2785, please.

VPS and migration is working well.

 

MetaTrader 5 build 2784

Отладчик практически нерабочий:

Отладчик практически нерабочий:

Стоит уйти в mqh-файлы и становится практически невозможно трассировать переменные: Expression could not be evaluated. По не выявленным закономерностям может что-то отдебажить, а что-то нет. Как-то выхватил багу, когда курсор отладчика шел в обратном направлении (F10/11).

 
Vladimir Belozercev:

MetaTrader 5 build 2784

Отладчик практически нерабочий:

Стоит уйти в mqh-файлы и становится практически невозможно трассировать переменные: Expression could not be evaluated. По не выявленным закономерностям может что-то отдебажить, а что-то нет. Как-то выхватил багу, когда курсор отладчика шел в обратном направлении (F10/11).

Выключите галочку оптимизации кода при профайлинге в настройках редактора.

Иначе большинство ваших функций и переменных оптимизированы до полного отсутствия. Поэтому их нельзя увидеть.
 
Renat Fatkhullin:
Выключите галочку оптимизации кода при профайлинге в настройках редактора.

Иначе большинство ваших функций и переменных оптимизированы до полного отсутствия. Поэтому их нельзя увидеть.

Спасибо за подсказку, но не работает... Отключил. Перекомпилил код. Результат :

Настройки

Видно маркер трассировки... Только что создан объект.

Трассировка. Только что создан объект.

 

Возможно это поможет в локализации проблемы...

/* Есть тело функции. Декларация в классе */
void clEnv::Init( int iMode, string iPath="", int iCsvMode= SOpen|AddDate )     {
...
if( Title != "" )       {
        Path= StringFormat("%s%s\\%s\\", _Symbol, IntegerToString(Period()), Title);
...
}

Выполняем отладку по F10. По каким-то причинам, при выполнении некоторых функций (какой-то системы не заметил - больше похоже на случайный процесс), курсор отладчика перескакивает на строку декларации функции, в которой он исполняется.

Как в данном случае, при нажатии F10 на строке:

Path= StringFormat("%s%s\\%s\\", _Symbol, IntegerToString(Period()), Title);

 оказываемся на строке декларации в классе

void Init();
Еще раз F10, опять оказываемся на исходной строке и дальше всё идет как обычно, до тех пор, пока не попадется другая "особенная" функция.
 

Ренат, ещё большая просьба прокомментировать пост: https://www.mql5.com/ru/forum/360210/page41#comment_20757170.

Ну или не смотреть... Возможно я недостаточно ясно выразил там свою мысль. В принципе, я тут все расписал подробно. Рассмотрим следующий код, как шаблон:

class clTest{
        public:
        clTest();
        clTest( int SomePar );
        ~clTest();
        void Echo();
};

clTest::~clTest()
{
        Print("Destructor");
}

clTest::clTest()
{
        Print("Constructor default");
        /* предположим, что тут просто набор инициализации каких-то переменных */
}

clTest::Echo()
{
        Print("Echo");
}

clTest::clTest( int SomePar )
{
        clTest();                 /* делаем вызов конструктора по умолчанию чтобы проинитить переменные */
        /* Далее делаем что-нибудь специфичное с переданным параметром SomePar - это не принципиально */
        Print("Constructor with Pars");
 
} /* А на выходе из конструктора будет вызван ПОЧЕМУ-ТО деструктор */

void OnStart()  
{ 
 int N=1;
     Test= new clTest( N );   /* Создадим объект через параметрический конструктор */
     Test.Echo();            /* А вот тут, если мы обратимся к объекту Test - получим ошибку, потому что его не будет существовать! */
     /* что дальше - не  принципиально */
}

Казалось бы, что после

Test= new clTest( N );

мы должны получить созданный объект, но нет...

Если прогнать под дебаггером, то будет видно, что после выхода из процедуры параметрического конструктора

clTest::clTest( int SomePar )

будет вызван деструктор класса. Уверен, что так быть не должно, когда вложенный вызов конструкторов вызывает создание и самоуничтожение объекта класса. И причиной этому - вложенный вызов конструктора по-умолчанию. Уберите его - и все будет работать в штатном режиме.

Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике
Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике
  • 2021.02.13
  • www.mql5.com
В пятницу 15 января 2021 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Vladimir Belozercev:

Ренат, ещё большая просьба прокомментировать пост: https://www.mql5.com/ru/forum/360210/page41#comment_20757170.

Ну или не смотреть... Возможно я недостаточно ясно выразил там свою мысль. В принципе, я тут все расписал подробно. Рассмотрим следующий код, как шаблон:

Казалось бы, что после

мы должны получить созданный объект, но нет...

Если прогнать под дебаггером, то будет видно, что после выхода из процедуры параметрического конструктора

будет вызван деструктор класса. Уверен, что так быть не должно, когда вложенный вызов конструкторов вызывает создание и самоуничтожение объекта класса. И причиной этому - вложенный вызов конструктора по-умолчанию. Уберите его - и все будет работать в штатном режиме.

Спасибо за сообщение.

В приведённом коде нет лишнего вызова деструктора, но имеется некорректное использование неявного объекта - исправим, запретим создание таких объектов.

 
Vladimir Belozercev:

Спасибо за подсказку, но не работает... Отключил. Перекомпилил код. Результат :

Видно маркер трассировки... Только что создан объект.

Предоставьте пожалуйста код для вопросизведения

 
Vladimir Belozercev:

Возможно это поможет в локализации проблемы...

Выполняем отладку по F10. По каким-то причинам, при выполнении некоторых функций (какой-то системы не заметил - больше похоже на случайный процесс), курсор отладчика перескакивает на строку декларации функции, в которой он исполняется.

Как в данном случае, при нажатии F10 на строке:

 оказываемся на строке декларации в классе

Еще раз F10, опять оказываемся на исходной строке и дальше всё идет как обычно, до тех пор, пока не попадется другая "особенная" функция.

Спасибо за соощение.

Поведение воспроизвели, исправим.

 
Ilyas:

Спасибо за сообщение.

В приведённом коде нет лишнего вызова деструктора, но имеется некорректное использование неявного объекта - исправим, запретим создание таких объектов.

Его нет, но он вызывается на return-е из параметрического конструктора.

Во всяком случае встроенный отладчик "показывает" его исполнение. Нажмите F11 на "выходной фигурной скобке"  параметрического конструктора ...

Файлы: