Errores, fallos, preguntas - página 1182

 
Zeleniy:

La optimización no funciona.

2014.08.05 19:34:42 Probador no se ha seleccionado ningún parámetro optimizado, por favor, compruebe la(s) entrada(s) a optimizar y establezca cuidadosamente los valores de inicio, paso y parada

La traducción no dio nada.

¿Qué quieres decir con "nada"? La traducción debería haberle indicado algo, como que debe seleccionar al menos un parámetro para la optimización y asegurarse de que los valores de inicio, fin y paso son correctos.
 
marketeer:
¿Qué quieres decir con "nada"? La traducción debería haberme dado algo, como que debo seleccionar al menos un parámetro para la optimización y asegurarme de que el inicio, el final y el paso de la prueba son correctos.
Es muy raro, no entiendo nada, tal vez sólo estoy cansado, todavía estoy luchando con los errores para el segundo día. Gracias, confiaré en sus palabras.
 

Me enfrenté a este problema: necesito comparar dos objetos de la misma clase entre sí y decidí sobrecargar el operador == por comodidad. Resultó que si los objetos son dinámicos, mi operador no se ejecuta, y en lugar de los propios objetos se comparan sus punteros. Bueno, en principio tiene sentido, se requiere la operación de saltar al objeto por su puntero: *a == *b. Pero en MQL se había olvidado esta posibilidad. Tenemos que añadir.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Aunque acabo de pensar que el hecho de que estemos comparando punteros en lugar de objetos es fundamentalmente erróneo, teniendo en cuenta las especificidades del lenguaje. Después de todo, MQL es un lenguaje gestionado, y el propio concepto de "objeto" se utiliza aquí independientemente de cómo se almacena el objeto y cómo se accede a él. Los miembros y los métodos se acceden en cualquier caso mediante un punto. En consecuencia, el operador de comparación debería funcionar de la misma manera tanto para los objetos seleccionados estáticamente como para los dinámicos. Y si necesita comparar punteros, debería hacerloutilizando GetPointer().

 
meat:

Aunque estaba pensando que el hecho de que haya una comparación de punteros en lugar de los propios objetos es fundamentalmente erróneo, dadas las particularidades del lenguaje.

No hay necesidad de inventar reglas de comparación en MQL que contradigan a C++, siempre y cuando puedas hacerlo por otros medios. Si tiene punteros y necesita comparar objetos, utilice una función de comparación.
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
Una cosa es permitir un registro de la forma (*a == *b) y otra muy distinta dar un significado diferente al registro (a == b)
 

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?

 
A100:
No es necesario inventar reglas de comparación en MQL que contradigan a C++, siempre que se puedan utilizar otros medios. Si tienes punteros y necesitas comparar objetos, utiliza una función de comparación Una cosa es sugerir que se permita una entrada del tipo (*a == *b), y otra muy distinta dar un significado diferente a la entrada (a == b)

Bueno, estoy explicando que las reglas de MQL contradicen a C++ tal y como es. Referirse a un objeto mediante un puntero aquí se hace con un punto, mientras que debería hacerse con ->, si seguimos las reglas de C++.

Es decir, "puntero" y "objeto" son dos nociones absolutamente diferentes en C++, por eso la sintaxis es diferente, todo es estricto. Pero aquí todo se confunde, parece que nos dirigimos a propiedades y métodos de un puntero. No digo que sea malo, es más conveniente para la POO, se hace en C# por ejemplo. Pero entonces todo lo demás debe ser implementado de la misma manera, debe haber un solo concepto. De lo contrario se producen contradicciones y confusiones: en algunos casos usamos un puntero de la misma manera que el propio objeto, y en otros casos el puntero de repente cobra vida.

Pasando a la parte práctica de todo esto, ya me he enfrentado a un problema: mi código utilizaba objetos estáticos. Entonces decidí sustituir algunos de ellos por otros dinámicos. Como resultado, las operaciones de comparación y asignación empezaron a funcionar de forma bastante 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.

 

Tengo alguna clase en mi código que contiene algún objeto:

CClass
{
  ...
  CObj  Object; 
  ...
};

La clase CObj se declara antes que ella.

Al intentar compilar me sale el siguiente error: 'Object' - cannot be unset

¿Qué significa este error y cuál es su causa? No recuerdo haber encontrado este error antes. La clase CObj tiene un constructor y un destructor.

Intenté declarar Object simplemente como una variable - todo está bien. Pero no lo hace cuando es parte de una clase.

 
Entonces, ¿alguien puede explicar qué es este error ("- no se puede deshacer")? ¿Cuándo se produce?
 
meat:
Entonces, ¿alguien puede explicar qué es este error ("- no se puede deshacer")? ¿Cuándo se produce?
La función ZeroMemory no se puede utilizar para este objeto