Errores, fallos, preguntas - página 2682

 

Error en MT5 (build 2367) Las prioridades de ejecución de las funciones de plantilla en MQL no se corresponden con las de C++ (en línea: https://onlinegdb.com/B172m1PLL).
Parece que, como parte de la corrección de errores, el error de compilación se ha solucionado, pero la prioridad de ejecución de las funciones de plantilla sobrecargadas sigue sin estar alineada con el comportamiento de C++.

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};

                                         
struct AA{
public:
   static void test(B<int>& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   
   A<B<int>>::test(bb);         // MQL:2,  should be 1     
   AA::test(bb);                // MQL:2,  should be 1     
}
 

Me encontré con un problema curioso. Es imposible pasar un tipo de plantilla con varios tipos-parámetros a una macro, porque el preprocesador no sabe que se trata de una plantilla y considera los parámetros por comas.

Encontré la descripción del problema y su solución para C++ en el SO.

#define  COMMA ,
#define  XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

Lo intenté en MQL, pero desafortunadamente no funcionó. El compilador da un error "identificador no declarado" para una variable descrita por el tipo pasado.

Por ahora me las he arreglado con una clase derivada adicional, pero ¿puedo arreglarlo en C++?

Uy. Encontré una solución. Así es como funciona:

#define  COMMA() ,
La pregunta está eliminada.
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

Error en MT5 (build 2367) la ubicación de las funciones de plantilla sobrecargadas afecta al resultado de la compilación.
El billete original con el que se realizó el trabajo -https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++ en línea(https://onlinegdb.com/BJzbH2DLL).


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

Defectos en el funcionamiento de la caché de la función/clase de la plantilla:
(arreglado por MT5(build 2368)) ***(arriba) Comportamiento indefinido, creas un objeto complejo envuelto con el tipo interno "C" varias veces y resulta ser un tipo de datos completamente diferente, tal vez "B", tal vez "int", lo que quieras...
(arreglado por MT5(build 2368)) * Error de compilación, error al pasar un puntero de función como argumento de plantilla const ref.
(arreglado por MT5(build 2368)) * Error de compilación, el objeto B<int> puede ser creado después del objeto B<void*>, pero se produce un error de compilación si se hace antes.


Defectos en el trabajo de la función/clase de la plantilla:
(arreglado por MT5(build 2368)) ***(arriba) Error de compilación, error dentro de la función de plantilla, el puntero pasado dentro de laconversión de tipo explícito se comporta como una clase de otra manera.
(arreglado por MT5(build 2368)) **(arriba) Error de compilación, error al intentar acceder a la clase interna de un parámetro de plantilla de una función de plantilla.
(no se ha solucionado con MT5(build 2368)) *** Error de compilación, la principal queja es una advertencia de salida inapropiada - "comportamiento obsoleto, la llamada a métodos ocultos se desactivará en una futura versión del compilador MQL". La implementación actual es disparar a los pájaros con una pluma.
(no se ha solucionado con MT5(build 2368)) ** Error de compilación, el error se refiere al valor de retorno de una función de plantilla cuando el valor de retorno es una clase interna dentro de una clase de plantilla cuyo tipo de parámetro es establecido por el tipo de argumento de la función de plantilla.
(no se ha solucionado con MT5(build 2368)) ** Error de compilación, error de espacio de nombres y alcance en el constructor de la plantilla al llamar a una clase base cuando se utiliza el mismo nombre de clase en la herencia y en la clase interna.
(no se ha solucionado con MT5(build 2368)) * Error de compilación, error en la llamada a una función de plantilla con tipos de argumentos explícitos cuando se llama desde una función sobrecargada no de plantilla.
(no corregido por MT5(build 2368)) Error de compilación, error en la definición de la clase interna - no hay referencia al espacio de nombres global cuando se define una clase base.
(arreglado por MT5(build 2368)) ** Error de compilación, error en la generación del código de la clase de la plantilla cuando se utiliza la clase interna.
(arreglado por MT5(build 2368)) ** Error de compilación, error en la generación del método/clase de la plantilla, el proceso de auto sustitución del parámetro de la plantilla está fuera del ámbito en el código del programa principal.
(arreglado por MT5(build 2368)) * Error de compilación, error con la ausencia de autogeneración de código de clase de plantilla cuando la clase de plantilla actúa como valor de retorno para el método de plantilla.
(arreglado por MT5(build 2368)) * Error de compilación, error al pasar una estructura interna a una función de plantilla, eltipo de datos resultante no puede utilizarse como tipo de datos base para otra estructura interna en la clase de plantilla.
(arreglado por MT5(build 2368)) * Error de compilación, la comprobación de los nombres de tipo de plantilla reutilizados no se realiza cuando se declara una función de plantilla dentro de una clase de plantilla, lo que conduce a un comportamiento inesperado.
(corregido por MT5(build 2368)) Error de compilación, múltiples defectos relacionados con la devolución del objeto "creado en el lugar" cuando el objeto es una clase/estructura de plantilla.
(no se ha solucionado con MT5(build 2368)) *( No es un bug, es una característica) en el constructor de la clase base es imposible realizar un typecast explícito al convertir el puntero a objeto de la clase base en puntero a la clase padre.


Defectos relacionados con la inconsistencia en las prioridades de las llamadas de las funciones sobrecargadas en MQL vs C++:
(arreglado por MT5(build 2368)) **(arriba) Error de compilación, la prioridad de llamada de las funciones de plantilla sobrecargadas depende en realidad del tipo de parámetro de la plantilla, lo que teóricamente no afecta al resultado de la compilación.
(arreglado por MT5(build 2368)) **(arriba) Error de compilación cuando la primera función de plantilla sobrecargada utiliza una clase base de plantilla totalmente especializada y la segunda utiliza una clase base de plantilla no especializada.
(no se ha solucionado con MT5(build 2368)) ** Error de compilación, se produce un error de compilación al generar código para una función de plantilla a pesar de que existe una función de plantilla sobrecargada con una firma adecuada para los parámetros pasados.
(no se ha solucionado con MT5(build 2368)) * Error de compilación, "llamada ambigua a función sobrecargada" cuando se llaman funciones de plantilla sobrecargadas con diferente número de parámetros de plantilla.
(arreglado por MT5(build 2368)) *** Error de compilación cuando se heredan las clases A <= B <= C <= D y se implementan dos funciones de sobrecarga, por ejemplo, una con el parámetro A* y la segunda con el parámetro B*, luego se pasa un objeto C* o D* en dicha función en MQL provoca un error de compilación "llamada ambigua a función sobrecargada".
(arreglado por MT5(build 2368)) ** Tiempo de ejecución, desajuste de prioridades en las llamadas a funciones de plantilla sobrecargadas.

Defectos relacionados con la lentitud en la ejecución de funciones, rendimiento del optimizador de código:
(arreglado por MT5(build 2368)) ** Tiempo de ejecución, gran sobrecarga al añadir un elemento a la vez en un array usando ArrayResize, a pesar de que la memoria para ellos ha sido reservada, por ejemplo, las estructuras son hasta 7 veces más lentas.


Sugerencias:
(nuevo) enlace - sobre la implementación del soporte de intellisense para la funcionalidad del espacio de nombres basado en el trabajo de intellisense para los métodos estáticos en las clases.
link- para permitir que los literales y las variables temporales se pasen como argumentos de funciones const ref.
enlace- almover los archivos del proyecto en la pestaña Proyecto, para los archivos movidos que están abiertos y en las pestañas ME, para actualizar automáticamente su ruta de ubicación.
link- para introducir la funcionalidad de la declaración typedef en MQL.
link- sobre la posibilidad de forzar la generación de constructores de copia y operadores de asignación por defecto.

 
Error de compilación en MT5 (build 2368) 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.
Todo funcionaba antes, aparentemente algo se rompió como parte de la corrección de otros errores.

class A{};

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

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

Error de compilación de MT5 (compilación 2368) al llamar a la sentencia de asignación mediante la indicación explícita de la clase base. El problema se produce parauna clase de plantilla con parámetro de plantilla como clase base.
Antes funcionaba, aparentemente algo se rompió como parte de la corrección de otros errores.

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
¿La actualización de la MT5 del 08.03.2020 ha comenzado a tener un historial de operaciones que salta?
Archivos adjuntos:
 

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

Bichos, errores, preguntas

fxsaber, 2020.03.22 10:04

mq5 está bien. mq4 está roto. Puedes tomar TypeToBytes_ExampleScript.mq4 desde aquí. Sólo se compila si se cambia la extensión a mq5.

2368: nada ha cambiado.

 

A través de un terminal MT5 siempre podía entrar en la cuenta de cualquier broker. Si había algún problema con el primer inicio de sesión, simplemente utilizaba las herramientas del Terminal para buscar el broker adecuado, obteniendo automáticamente los datos de sus servidores de negociación. Después de eso pude iniciar la sesión sin problemas.


Hoy me he enfrentado por primera vez a una situación (corredor nuevo), que nada ayuda. No puedo conectarme. En el registro escribe.

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


He descargado el terminal nativo del broker - se conecta inmediatamente. Mi terminal de investigación - de ninguna manera. Por primera vez tal.

¿Pueden decirme cómo hacer que un terminal no nativo pueda conectarse a la cuenta de operaciones?

 
fxsaber:

¿Pueden decirme cómo hacer que un terminal no nativo pueda conectarse a una cuenta de operaciones?

En mt4 tuve que copiar el archivo server.ini a otra terminal, para no tener que buscar los servidores de comercio

no sé en mt5

Razón de la queja: