Errores, fallos, preguntas - página 2755

 

Error del compilador. Funciona bien en las versiones anteriores.

struct A { };

template<typename T> 
struct B : T { };  // 'A' - unexpected token

struct C : B<A> { };
 

Tengo un Asesor Experto tan simple (ver captura de pantalla).

Hay objetos Chart superpuestos en el gráfico.

Antes de la actualización de la terminal de ayer se mostraban los niveles de negociación en los gráficos, pero ahora han desaparecido.

He creado gráficos como se muestra en el ejemplo del manual. No he encontrado ninguna propiedad del gráfico para mostrar los niveles comerciales (sólo los gráficos básicos tienen esa propiedad).

Por favor, ayuda.

Capturas de pantalla de la plataforma MetaTrader

GBPUSD, M5, 2020.05.25

Forex Club International Limited, MetaTrader 5, Real

GBPUSD, M5, 2020.05.25, Forex Club International Limited, MetaTrader 5, Real


Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
  • www.mql5.com
//| Создает объект "График"                                          |               chart_ID=0,                               sub_window=0,                             x=0,                                      y=0,                                      width=300,                                height=200,               ...
 

Hola. Por favor, ayúdenme a entender lo que está escrito.

mqlrate rt [2] ;

¿Estoy en lo cierto al suponer que se trata de un array de dos estructuras que recibieron automáticamente los mismos datos de estructura?

Sólo que además no hay asignación de datos a la matriz y entonces los datos de la matriz se utilizan de una vez.
 
Ivan_Invanov:

Hola. Por favor, ayúdenme a entender lo que está escrito.

mqlrate rt [2] ;

¿Estoy en lo cierto al suponer que se trata de un array de dos estructuras que recibieron automáticamente los mismos datos?

Escrito en MQL5:

MqlRates rt[2]

significa: se declara una matriz estática de dos estructurasMqlRates. Después de la declaración, estas estructuras pueden almacenar galimatías, por lo que hay que llenarlas explícitamente con datos.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Константы, перечисления и структуры / Структуры данных / Структура исторических данных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Escribir en MQL5:

significa: se declara un array estático de dos estructurasMqlRates. Una vez declaradas, estas estructuras pueden almacenar galimatías, por lo que es necesario llenarlas explícitamente con datos.

Gracias.
 
Alexey Navoykov:

Error del compilador. Funciona bien en las versiones anteriores.

Sí existe, se informó desde el 2020.03.25, ya día a día desde hace 2 meses...
(
no corregido por MT5(build 2390)) (nuevo) Error de compilación, al utilizar el modificador de acceso por defecto al heredar en la clase de la plantilla, cuando el parámetro de la plantilla actúa como clase base.

 

Otro error:

class A
{
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
};

class D : public C
{
 public:
  void operator=(A const& other) { }
};

void OnStart()
{
  C c;
  D d;
  d = c; // attempting to reference deleted function 'void C::operator=(const C&)'
}

Culpa a C::operator=, aunque aquí se ejecuta D::operator=. Para solucionar el error, hay que sobrecargar el operador para todas las clases base de la jerarquía.


p.d. En general, los desarrolladores prometieron arreglar el comportamiento incorrecto del operador de asignación hace tiempo, pero sigue ahí. Esto es una barbaridad. Por ejemplo, el siguiente código compila sin errores aunque está asignando lo que sea:

#include <Expert\Expert.mqh>

#include <Strings\String.mqh>

void OnStart()
{
  CExpert Expert;
  CString String;
  Expert = String; // Ошибки нет. Типа всё нормально?
}
 
Alexey Navoykov:

Un error más:
1) Se queja de C::operator=, aunque aquí se ejecuta D::operator=. Para evitar el error, tenemos que sobrecargar el operador para todas las clases base de la jerarquía.
2) En general, los desarrolladores prometieron arreglar el comportamiento incorrecto del operador de asignación hace tiempo pero sigue ahí - es una barbaridad. Por ejemplo, el siguiente código compila sin errores aunque asigna lo que sea:

1) Lo más probable es que esto no sea un error, sino más bien un comportamiento natural teniendo en cuenta las características específicas de MQL, a saber:
En MQL, los métodos y campos de la clase base están "directamente disponibles" desde las clases derivadas.
En esencia, el comportamiento de la herencia en MQL es similar al uso de la declaración para cada campo y método básico en C++.
C++ en línea:https://onlinegdb.com/rJkckvFsU

class A
{
public:
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
public:
    //void operator=(C const& other) { printf("C");}
};

class D : public C
{
public:
#ifdef __cplusplus
  using A::operator=;
  using B::operator=;
  using C::operator=;
#endif
  void operator=(A const& other) { printf("D");}
};

void OnStart()
{
  C c;
  D d;
  d = c; 
}



Así, todas las funciones operator= de las clases base también intervienen en la operaciónd = c;
al buscar la función adecuada.
Como resultado, la firma óptima para una llamada a una función sobrecargada es la predeterminada y eliminada void operator=(const C&).

 
Sergey Dzyublik:

1) Lo más probable es que no sea un error, sino un comportamiento natural teniendo en cuenta las peculiaridades de MQL, a saber:
En MQL, los métodos y campos de una clase base están "directamente disponibles" desde las clases descendientes.
En esencia, el comportamiento de la herencia en MQL es similar al uso de la declaración para cada campo y método básico en C++.
C++ en línea:https://onlinegdb.com/rJkckvFsU


Así, todas las funciones operator= de las clases base también intervienen en la operaciónd = c;
al buscar la función adecuada.
Como resultado, la firma óptima para una llamada a una función sobrecargada es la predeterminada y remota operator=(const C&).

No hay que buscar el sentido sagrado en un fallo lingüístico evidente. Ya planteé este problema aquí e Ilyas me aseguró que se corregiría. Pero ya han pasado casi 10 meses. (

En esencia, el comportamiento de la herencia en MQL es similar al de C++ utilizando la declaración

Sí, bueno, si en MQL por ejemplo 2 x 2 = 5, se podría decir que es lo mismo que en C++ añadiendo una operación de incremento al resultado)

 
Alexey Navoykov:

No hay que buscar el sentido sagrado en un fallo evidente del lenguaje.

Se le explicó cómo y por qué funciona, si es difícil para usted - afortunadamente no puedo ayudar...
No es un significado sagrado, sino un enfoque común para bajar el nivel de entrada del usuario, para que pueda acceder a los campos y métodos de la clase base sin usar "this.", así como en casos de sobrecarga de una función de la clase base.