Особенности языка mql5, тонкости и приёмы работы - страница 148

 

подскажите, почему стал ругаться компилятор вот на это (скрины приложил)?

год назад всё было ок, а сейчас поставил последний терминал, компилю и вот

и где искать ответы на такие сообщения компилятора?

и как правильно разрешить это предупреждение?

upd. добавил третий скрин - такое же сообщение на безобидный код

и 4-й скрин

что за строгости компилятора и как решить?

Компиляция - Разработка программ - Справка по MetaEditor
Компиляция - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Компиляция — это процесс перевода исходного кода MQL4/MQL5-программы на машинный язык. Ее результатом является создание исполняемого файла программы (*EX4 или *.EX5), который может быть запущен в торговой платформе. Скомпилировать можно любой файл (*.MQ4, *.MQ5 или *.MQH), однако исполняемый файл (*.EX4 или *.EX5) может быть получен только в...
Файлы:
22.png  6 kb
3.png  4 kb
4.png  5 kb
 
/+------------------------------------------------------------------+
TT
class cl_search_: public cl_search_b<T>
  {
#define ME cl_search_<T>
#define THIS &this
public:
   atype             adres;lin;//Ошибка тут компилятор молчит
   ME               *m[2],*par;
   atype Adress()                            {return par==NULL? adres :(adres|(par.m[1]==THIS? (par.lin^(par.lin<<1))>>1: 0)|par.Adress()); }
   string AdressStrBit(int move=0)           {return  "|| "+IntToBitString(adres)+" "+(string)lin+(par==NULL? "\n": ((" "+(string)(par.m[1]==THIS ?(par.lin^(par.lin<<1))>>1 :0))+" \n"+(par.AdressStrBit())));}
   string IntToBitString(atype s=0)          {if(s==0) {s=adres;} string itog ="W"; atype a=1; uchar ss=sizeof(atype)*8; for (char i=ss-1; i>=0; i--) itog+=(string)(uint)((s&a<<i)>0); return itog;}
   void CorrectPar()                         {if(m[0]!=NULL) m[0].par=THIS; if(m[1]!=NULL) m[1].par=THIS;}

   ME *Select(bool next=true) {return par==NULL ?  par:((par.m[next]==THIS || par.m[next]==NULL) ?  par.Select(next) :par.m[next].Start(!next)); }
   
   
   ME *Port(atype a,bool write=true)
     {
#define PORT(A) Port(A&linre,write)
#define NEW new ME(THIS)
      if(m[1]==NULL && m[0]==NULL)
        {
         if(!write) return NULL;
         //lin=(~(atype)0)<<1;
          adres=a&lin;
         return m[a&1]=NEW;
        }
      atype h111=(lin&a)^adres;
      atype linre=(~lin)>>1;
      if(h111==0)
fxsaber
:

Столкнулся с такой особенностью.


Если во время определения класса со статическими полями тут же создается его объект, будет ошибка компиляции.

В последней версии компилятор не ругался на переменную без типа в классе. Но советник крашился при запуске

 

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

улучшение?

есть ли ещё такие?

 
есть ли ещё такие?
StringTrimLeft / Right

StringConcatenate

наверняка ещё что-то есть, мне тоже интересен полный список таких функций

---

возможно, стоит пройтись поиском по #endif в стандартной библиотеке

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
в четвёрке было можно индикатор самого себя вызывать через iCustom, чтобы мультитаймфрэйм получить. Не поделитесь ссылкой/примером для пятерки? почему-то не получается по аналогии сделать :(
 

Но боевом советнике нарвался на ситуацию, когда советник прекратил работу. Удалось въехать в причину. Классный нюанс, который заметить почти невозможно.

Реально прочувствовать его можно, попробовав увидеть проблему в этом коде.

// В коде содержится ошибка, которая остановит выполнение этого советника.

input int Range = 0;

class A
{
public:
  void f() {}
};

A* const a = new A;

void OnInit() { a.f(); }

void OnDeinit( const int ) { delete a; }
 
fxsaber:

Но боевом советнике нарвался на ситуацию, когда советник прекратил работу. Удалось въехать в причину. Классный нюанс, который заметить почти невозможно.

Реально прочувствовать его можно, попробовав увидеть проблему в этом коде.

Одно из главных правил - на каком уровне конструируете объект, на том же уровне нужно его дестроить. Не выше и не ниже.
 
Slava:
Одно из главных правил - на каком уровне конструируете объект, на том же уровне нужно его дестроить. Не выше и не ниже.

Спасибо, хорошее правило. Стал жертвой своей некомпетентности. Правда, нужно еще какое-то правило для такого более очевидного случая.

// В коде содержится ошибка, которая остановит выполнение этого советника.

input int Range = 0;

class A
{
  void f() {}
public:
  A()
  {
    static A* Tmp = &this;
    
    Tmp.f();
  }
};

void OnInit() { A a; }


Может на оба случая Warning умный делать?

 
fxsaber:

Но боевом советнике нарвался на ситуацию, когда советник прекратил работу. Удалось въехать в причину. Классный нюанс, который заметить почти невозможно.

Реально прочувствовать его можно, попробовав увидеть проблему в этом коде.

А в чем проблема этого кода? В Deinit пришибли объект по константному указателю (знаю, что тут хэндл). Нормальная стрельба по конечностям в С++ стиле, а то распустили всех создатели)))
Причина обращения: