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

 
fxsaber #:
Es un resultado interesante.

Es extraño que aún no se haya solucionado:

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Errores, fallos, preguntas

A100, 2020.08.01 05:42

Error durante la ejecución:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Result: OnStart::unnamed#00000216656562DC80::f<ulong>

Esperado: OnStart::f<ulong>


 
fxsaber #:
Limitación del compilador.

Se trata de un defecto obvio: creo que el compilador debería llamar ya a un equipo médico para este tipo de código.

Es hipotéticamente posible imaginar paréntesis en macros anidadas en tal cantidad, pero no llaves.
 
Por favor, indíquenos si éste es el comportamiento correcto o no, en el que la secuencia de inicialización de los campos de un objeto estructura/clase depende de la disposición mutua de los campos y no de las entradas posteriores al constructor.
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

La expectativa era inicializar de izquierda a derecha como se especifica en el constructor.

C() : i(this.Count++), j(this.Count++) {}

Pero resultó que la inicialización va de arriba a abajo por campos. Y la secuencia especificada de inicialización después del constructor no es importante. ¿Es esto correcto?

 
fxsaber #:
Por favor, indique si este es el comportamiento correcto o no, donde la secuencia de inicialización de los campos de un objeto estructura/clase depende de la disposición mutua de los campos y no de las entradas después del constructor.

La expectativa era inicializar de izquierda a derecha como se especifica en el constructor.

Pero resultó que la inicialización va de arriba a abajo por campos. Y la secuencia especificada de inicialización después del constructor no es importante. ¿Es esto correcto?

¿Por qué los desarrolladores escriben una ayuda tan detallada si nadie la lee? Sugiero simplificar la ayuda a una frase: Pregunta en el foro - ¡te ayudarán!

 
A100 #:

¿Por qué los desarrolladores escriben una ayuda tan detallada si nadie la lee? Propongo simplificar la ayuda a una frase: Pregunta en el foro - ¡te ayudarán!

Cuando el esquema de encontrar la respuesta a una pregunta en la ayuda sea claro, recurriré a la ayuda del foro con menos frecuencia.

 
fxsaber #:

Cuando entienda el esquema de encontrar la respuesta a la pregunta en la ayuda, utilizaré el foro con menos frecuencia.


En "Tipos de datos" -> "Estructuras y clases".

En la lista de inicialización, los miembros pueden ir en cualquier orden, pero todos los miembros de la clase se inicializarán según el orden de su declaración.
 
Sergey Gridnev #:

En "Tipos de datos" -> "Estructuras y clases"

En la lista de inicialización, los miembros pueden ir en cualquier orden, pero todos los miembros de la clase se inicializarán según el orden en que se declaren.

Gracias. Por desgracia, no siempre está claro dónde y cómo buscar.

 
fxsaber #:

Gracias. Por desgracia, no siempre está claro dónde y cómo buscar.

Sí, lo es.
 

He encontrado una cosa muy desagradable en el trabajo del indicador (MT5 y MT4).
Los eventos bloquean el trabajo del temporizador.
No existe tal cosa en Expert Advisor.
Una vez más estoy convencido de que no tiene sentido utilizar indicadores donde se requiere un trabajo estable del temporizador. Esto es especialmente cierto para las interfaces de respuesta.

Aquí hay un indicador que demuestra este problema, donde el temporizador se establece en 20 milisegundos y el tiempo entre los eventos del temporizador se muestra si supera los 100 milisegundos.

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+



 
Añadido.
template <typename T>
class A
{
public:  
  void f() const { ::Print(typename(T)); }
};

void OnStart()
{
  const A<MqlTick> a;
  
  a.f(); // struct MqlTick
}
Razón de la queja: