Errores, fallos, preguntas - página 1183
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Al probar el Asesor Experto, se genera un error
toma de beneficios no válida para la función OrderSend
Error de OrderSend 4107
¿Cómo puedo solucionarlo sin entrar en el código?
La función ZeroMemory no se puede utilizar para este objeto
Ya veo, pero ¿por qué el compilador muestra este error no en un lugar donde se utilizaZeroMemory sino en un lugar donde se define la clase? Es confuso. Ya me he devanado los sesos tratando de averiguar cuál es el error y dónde se encuentra. Por favor, asegúrese de que el error se muestra en un lugar correcto. Por ejemplo, al copiar un objeto que contiene elementos no permitidos para ser copiados, el error se produce exactamente en la línea con la copia y no en algún lugar dentro de la clase.
Pasando a la parte práctica de todo esto, ya me he encontrado con un problema. El código utilizaba objetos estáticos. Entonces decidí sustituir algunas de ellas por otras dinámicas. Como resultado, las operaciones de comparación y asignación empezaron a funcionar de forma muy diferente. Y este problema era difícil de detectar porque el programa sigue compilando y funcionando normalmente pero no de la manera que debería.
No entendí inmediatamente el problema
De esto se desprende que (a != a) lleva a comparar punteros mientras que (a >> a) lleva a llamar al operador >>( A* )Hay una contradicción.
No se puede cambiar el comportamiento de (a >> a) como otros operadores sobrecargados (a excepción de == y !=) porque hará imposible la siguiente construcción, ya que no se puede devolver (A) sino que sólo se puede devolver (A*).
También será imposible utilizar plenamente los operadores sobrecargados porque no existe una operación de conversión de puntero a objeto (*a)
Lo único que queda por hacer es cambiar el comportamiento de (== y !=)
Para comparar punteros (== y !=) entre sí y con el número cero (porque otras operaciones con punteros no tienen sentido), se debe introducir una función especial como (GetPointer) o especificar explícitamente una conversión de tipo al compilador
De este modo, se mantendrá la posibilidad de utilizar plenamente los operadores sobrecargados y se eliminará la contradicción mencionada anteriormente
La única excepción razonable a la regla general debería seguir siendo operator=() porque
eliminaría todas las contradicciones de una vez.
Corrección: en realidad, las contradicciones se eliminan sólo parcialmente, porque dicha notación (*a) no resuelve el problema del uso múltiple de los operadores (que ahora funciona con éxito con todos los operadores, excepto == y !=) - por lo que la mejor manera de comparar punteros entre sí en igualdad/desigualdad sigue siendo el uso de la función especial - o la conversión explícita al tipo ulong
esto está bien, y esto
error de compilaciónSiguiendo con el tema de los punteros, estaría bien añadir a MQL el operador estándar de tomar un puntero'&', sería mucho más cómodo y compacto que el engorroso GetPointer.Así, teniendo los operadores * y & en nuestro arsenal, podemos definir explícitamente las operaciones necesarias:
Y hay más sobre este ampersand. MQL carece de referencias a variables, sobre todo teniendo en cuenta el uso limitado de punteros (sólo a objetos de clase). La función requiere a menudo el acceso a un elemento de estructura profundamente anidado o a una matriz multidimensional. Tengo que escribir la ruta completa hasta ella cada vez, lo que hace que el código sea muy engorroso.Puedes simplificar las cosas creando una referencia y a veces sólo tienes que "cambiar" el nombre de una variable localmente por conveniencia. Sin embargo, ¿qué estoy explicando aquí? Todo el mundo ya sabe lo conveniente que es usar referencias, pero ahora tienes que usar #define en su lugar, lo que ciertamente no es bueno.
Y también necesitamos la capacidad de pasar el resultado de una función por referencia, es decir, double& Func() { }
Facebook ha visto recientemente la aparición del backlinking de las publicaciones de los blogs:
Siguiendo con el tema de los punteros, sería bueno añadir a MQL un operador estándar de tomar un puntero'&', sería mucho más conveniente y compacto que el engorroso GetPointer.Así, al disponer de los operadores * y &, podemos definir de forma inequívoca las operaciones necesarias:
Adoptar sólo (*a) para referirse a las funciones miembro no aporta ninguna ventaja clara, sino que conduce a la imposibilidad de una aplicación múltiple simple y clara de los operadores.
Intenta reescribirlo teniendo en cuenta tu sugerencia
No se puede utilizar el propio objeto en lugar del puntero porque el operador <<(...) sólo puede devolver un puntero al objeto.
¿Qué operaciones con punteros no tienen sentido? - Sólo la comparación entre sí y con un número - en consecuencia, deben ser descuidados y puestos en una función especial (por ejemplo, bool ComparePointer( a,b)) en aras de preservar la posibilidad de uso múltiple de los operadores, sin la cual la propia sobrecarga de operadores pierde su significado.