Errores, fallos, preguntas - página 2330

 
Ilyas:

Más o menos he descubierto la razón. Tengo una variable global.

CArrayObj actobjects;

Algo con el orden de inicialización del entorno mcl y la misión aparentemente, si actobjects un puntero y poner una matriz allí mismo, nada se bloquea. Clase en variables globales - mala práctica, por supuesto, voy a reescribir. Pero surgirán problemas con las matrices estáticas en las funciones (en µl la regla - la inicialización en el primer ingreso a la función no funciona).

En general, si se trata de un error, conociendo aproximadamente la causa, probablemente pueda localizarlo.

 
pavlick_:

De todas formas, si cuenta como bug, sabiendo más o menos la causa, puedo localizarlo supongo.

No, no se puede coger, desaparece milagrosamente después de cortar el código. Incluso comentar algunas líneas (que no se ejecutan antes de la caída) lo afecta.

 

Hay una clase de código largo, que se encuentra en mqh. Tenemos que crear exactamente la misma clase, que difiere de la original sólo en dos líneas (en lugar de menos signo debe haber más signo).

¿Se puede hacer esto sin crear otro mqh casi idéntico?


Cuando la clase es corta, se puede hacer fácilmente con una macro de varias líneas y todo sale fácil. Pero el código aquí es largo.

No quiero crear un mqh-clon porque si arreglo un mqh, tendré que repetir todas mis acciones en el segundo. Además, existe el factor humano del olvido y la falta de atención.


Todavía se puede hacer con una clase de plantilla. Pero no es en absoluto evidente cómo afectará a la velocidad de ejecución. La clase es necesaria para las carreras rápidas.

 
fxsaber:
#ifdef
 
TheXpert:
#ifdef

No funcionará. Ambas clases deben estar en funcionamiento.

 
fxsaber:

No funcionará. Ambas clases deben estar en funcionamiento.

No veo ningún problema.

_____________

herencia

poner las diferencias en pequeñas clases separadas

 
TheXpert:

No veo ningún problema.

_____________

herencia

Poner las diferencias en pequeñas clases separadas

Hay varios métodos de tamaño decente en una clase. En cada método sólo hay que sustituir el signo ">" por un signo "<".

Puedes utilizar un virtual como este
class A
{
private:
  virtual bool Compare()
  {
    return(true);
  }
public:

  bool f()
  {
    return(this.Compare());
  }
};

class B : public A
{
private:
  virtual bool Compare()
  {
    return(false);
  }
};


void OnStart()
{
  A a;
  B b;
  
  Print(a.f());
  Print(b.f());
}


Pero, por desgracia, todavía tenemos que pasar el valor de inicialización de la clase. Así que supongo que tendremos que usar una plantilla después de todo.

 
fxsaber:

Yo pasaría algunos adaptadores a través de los parámetros de la plantilla (no debería haber ningún freno ahí), pero si quieres ser tan torpe, también puedes. Haz un enlace duro al archivo de cabecera (mklink /H <link> <target>, si no me equivoco. Puedes buscar en Google "windows create hard link"). Y luego habilitar estas cosas de la manera habitual

#define _N C1    // имя класса
#define _M "c1"  // какой-то параметр
#include <qq.mqh>
#undef _N
#undef _M
#define _N C2
#define _M "c2"
#include <ee.mqh> // жёсткая ссылка на qq.mqh
#undef _N
#undef _M
 
pavlick_:

Yo pasaría algunos adaptadores a través de los parámetros de la plantilla (no debería haber ningún freno ahí), pero si quieres ser tan torpe, también puedes. Haz un enlace duro al archivo de cabecera (mklink /H <link> <target>, si no me equivoco. Puedes buscar en Google "windows create hard link"). Y luego sólo tienes que conectarlo de la forma habitual.

No entiendes nada.

 
fxsaber:

No entiendes la pregunta.

Por si acaso el listado es qq.mqh y ee.mqh (una entidad, al cambiar una cambia la otra)

class _N
{
public:
   void f() {Alert(_M);}
};

Todo según lo ordenado, clase no inmacros, casi lo mismo excepto _M.