Características del lenguaje mql5, sutilezas y técnicas - página 148

 

¿Pueden decirme por qué el compilador comenzó a maldecir esto (se adjuntan capturas de pantalla)?

hace un año todo estaba bien, pero ahora pongo la última terminal, compilo y esto

¿dónde puedo encontrar respuestas a estos mensajes?

¿y cómo resolver correctamente esta advertencia?

actualización. añadida la tercera captura de pantalla - el mismo mensaje en el código inocuo

y la 4ª captura de pantalla

¿cuál es el rigor del compilador y cómo solucionarlo?

Компиляция - Разработка программ - Справка по MetaEditor
Компиляция - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Компиляция — это процесс перевода исходного кода MQL4/MQL5-программы на машинный язык. Ее результатом является создание исполняемого файла программы (*EX4 или *.EX5), который может быть запущен в торговой платформе. Скомпилировать можно любой файл (*.MQ4, *.MQ5 или *.MQH), однако исполняемый файл (*.EX4 или *.EX5) может быть получен только в...
Archivos adjuntos:
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
:

Me encontré con tal peculiaridad.


Si durante la definición de una clase con campos estáticos su objeto se crea inmediatamente, habrá un error de compilación.

En la última versión, el compilador no se quejaba de la variable sin tipo en la clase. Pero el EA se estrelló al iniciarse

 

Me encontré con una "característica"... Me pasé más de una hora traduciendo el indicador de 4 a 5. No podía averiguar dónde estaba el error, ya que el código parecía ser multiplataforma. al final, aquí está, en un lugar poco visible. por alguna razón intercambiaron dos parámetros:

¿mejora?

¿hay más de estos?

 
¿hay más de estos?
StringTrimLeft / Right

StringConcatenate

probablemente hay más, también estoy interesado en una lista completa de tales funciones

---

podría valer la pena buscar #endif en la biblioteca estándar

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
En fours era posible llamar al propio indicador a través de iCustom para obtener un multitimeframe. ¿Puedes compartir un enlace/ejemplo para cinco? Por alguna razón no puedo hacerlo por analogía :(
 

Pero el consejero de batalla se encontró con una situación en la que el consejero dejó de trabajar. Logró llegar al fondo de la causa. Un matiz genial, que es casi imposible de notar.

Puedes hacerte una idea tratando de ver el problema en este código.

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

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:

Pero el consejero de batalla se encontró con una situación en la que el consejero dejó de trabajar. Logró llegar al fondo de la causa. Un matiz genial, que es casi imposible de notar.

Puedes hacerte una idea tratando de ver el problema en este código.

Una de las reglas principales es que, sea cual sea el nivel en el que construyas un objeto, debes destruirlo en el mismo nivel. Ni más alto ni más bajo.
 
Slava:
Una de las reglas principales es que a qué nivel construyes un objeto, al mismo nivel tienes que destruirlo. Ni más alto ni más bajo.

Gracias, buena regla. Me convertí en víctima de mi propia incompetencia. Realmente, se necesita alguna norma más para un caso tan evidente.

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

input int Range = 0;

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

void OnInit() { A a; }


Tal vez para ambos casos Advertencia inteligente de hacer?

 
fxsaber:

Pero el consejero de batalla se encontró con una situación en la que el consejero dejó de trabajar. Logró llegar al fondo de la causa. Un matiz genial, que es casi imposible de notar.

Puedes hacerte una idea tratando de ver el problema en este código.

¿Cuál es el problema de este código? Deinit clavó el objeto por puntero constante (sé lo que es el mango aquí). Disparo normal de extremidades en estilo C++, o bien los creadores han disuelto a todos))