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

 

В одном случае предупреждение, в другом ошибка

void f()
{
    for ( int i = 0;; )
    {
        Print( i );
        int    i = 5; //Warning: declaration of 'i' hides local declaration
        Print( i );
        break;
    }
}
void For( int i = 0 )
    {
        Print( i );
        int    i = 5; //Error: redefinition of formal parameter 'i'
        Print( i );
    }

А какая принципиальная разница? В C++ например в обоих случаях ошибка

 

Прошу помочь знающих людей разобраться в вопросе указателей на экземпляры классов. А то я не въезжаю. 

Имеем такой пример скрипта:

class A
  {
public :
                     A() { Print("Start"); };
                    ~A() { 
                     Print("End"); 
                     Print(EnumToString(CheckPointer(GetPointer(this)))); 
                     if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC) 
                     delete GetPointer(this);};
  };
  
A a;

void OnStart()
  {
  }

При выполнении имеем, как и предпологалось:

2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


если экземпляр класса объявляем так:

A *a= new A;

тогда при выполнении имеем:

2018.09.23 21:46:42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

т.е. деструктор даже не запускается, память соответственно не освобождается.


Если же экземпляр класса объявляем так:

A a= new A;

то конструктор запускается два раза, деструктор 1 раз, но при этом память не освобождается и имеем тип указателя объекта POINTER_AUTOMATIC , хотя предпологалось POINTER_DYNAMIC

2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


Как добиться всегда выполнения деструктора и правильного выполнения delete

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


Смотрите из С++ тему умных указателей и адаптируйте под MQL (https://habr.com/post/140222/). 
Может что есть в кодобазе...

 
Sergey Dzyublik:


Смотрите из С++ тему умных указателей и адаптируйте под MQL (https://habr.com/post/140222/). 
Может что есть в кодобазе...

спасибо, но не увидел там ответов на мои вопросы. 
Не понимаю, почему деструктор не вызывается при A *a= new A;

 
Nikolai Semko:

спасибо, но не увидел там ответов на мои вопросы. 
Не понимаю, почему деструктор не вызывается при A *a= new A;

Тогда попробуйте так:
class A { public:
         A() { Print( 1, ":", EnumToString(CheckPointer(GetPointer(this)))); }
        ~A() { Print( 2, ":", EnumToString(CheckPointer(GetPointer(this)))); }
};
class B { public:
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
        void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart() {}

Результат:

1:POINTER_AUTOMATIC
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMATIC

 
Nikolai Semko:

спасибо, но не увидел там ответов на мои вопросы. 
Не понимаю, почему деструктор не вызывается при A *a= new A;

Создаем оператором new, а удаляем оператором delete

 
Nikolai Semko:

спасибо, но не увидел там ответов на мои вопросы. 
Не понимаю, почему деструктор не вызывается при A *a= new A;

https://www.mql5.com/ru/docs/basis/variables/object_live

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных и всем им присвоить указатель одного объекта.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

Прошу MQL проверить функцию OnTimer().

Почему-то она не работает в тестере стратегий для МТ4 (Ошибок нет, просто ничего внутри этой функции не выполняется), при этом в онлайне все Ок.

Для МТ5 функция работает как в тестере, так и в онлайне.

Спасибо!

 
Много времени уходит на Incorrect-Init
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

В OnInit только два числа сравниваются, а времени на Incorrect-проход уходит больше, чем на полноценный проход! Как так?


Запускаем на полную Оптимизацию вот такой советник

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Получаем результат работы 8-ми Агентов

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Теперь такой советник

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Наконец, такой

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Два вывода

  1. Incorrect-Init и ExpertRemove - одно и то же по скорости.
  2. Пустой прогон в ~5 раз быстрее вылета из OnInit.


По второму пункту явно какая-то ошибка. Мне выгоднее по времени делать пустой прогон, нежели выскакивать из OnInit. Просьба поправить, т.к. почти полностью теряются преимущества Incorrect-Init и ExpertRemove.

 

Вкладка Избранное с советниками/индикаторами/скриптами и счетами запоминается только после выхода из Терминала. Из-за этого нештатный выход (электричество кончилось) сбрасывает эту вкладку. Возможно ли ее сохранять при изменении?

Иногда возникает четкое понимание, что было бы очень удобно, если бы в Избранное можно было бы добавлять папки.