Errori, bug, domande - pagina 2330

 
Ilyas:

Ho più o meno capito il motivo. Ho una variabile globale.

CArrayObj actobjects;

Qualcosa con l'ordine di inizializzazione dell'ambiente mcl e la missione apparentemente, se actobjects un puntatore e mettere un array me stesso, niente si blocca. Classe in variabili globali - cattiva pratica, ovviamente, riscriverò. Ma sorgeranno problemi con gli array statici nelle funzioni (in µl la regola - inizializzazione al primo accesso alla funzione non funziona).

In generale, se conta come un bug, allora conoscendo approssimativamente la causa, posso probabilmente localizzarlo.

 
pavlick_:

Comunque, se conta come un bug, conoscendo approssimativamente la causa, posso localizzarlo credo.

No, non si può prendere, sparisce miracolosamente dopo aver tagliato il codice. Anche commentare alcune linee (che non vengono eseguite prima del crash) lo influenza.

 

C'è una lunga classe di codice, che si trova in mqh. Dobbiamo creare esattamente la stessa classe, che differisce da quella originale solo in due righe (invece di meno segno dovrebbe esserci più segno).

Si può fare senza creare un altro mqh quasi identico?


Quando la classe è breve, si può facilmente fare con una macro multilinea e tutto viene fuori facilmente. Ma il codice qui è lungo.

Non voglio creare un mqh-clone perché se fisso un mqh, dovrò ripetere tutte le mie azioni nel secondo. Inoltre, c'è il fattore umano della dimenticanza e della disattenzione.


Potete ancora farlo con una classe template. Ma non è affatto ovvio come influirà sulla velocità di esecuzione. La classe è necessaria per le corse veloci.

 
fxsaber:
#ifdef
 
TheXpert:
#ifdef

Non funzionerà. Entrambe le classi devono essere in funzione.

 
fxsaber:

Non funzionerà. Entrambe le classi dovrebbero essere in funzione.

Non vedo il problema.

_____________

eredità

mettere le differenze in piccole classi separate

 
TheXpert:

Non vedo il problema.

_____________

eredità

Mettere le differenze in piccole classi separate

Ci sono diversi metodi di dimensioni decenti in una classe. In ogni metodo devi solo sostituire il segno ">" con un segno "<".

Potete usare un virtuale come questo
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());
}


Ma, sfortunatamente, abbiamo ancora bisogno di passare il valore di inizializzazione della classe. Quindi credo che alla fine dovremo usare un modello.

 
fxsaber:

Io passerei alcuni adattatori tramite parametri di template (non dovrebbero esserci freni lì), ma se vuoi essere così maldestro, puoi farlo anche tu. Fate un collegamento fisso al file di intestazione (mklink /H <link> <target>, se non mi sbaglio. Potete cercare su Google "windows create hard link"). E poi abilitare questa roba nel solito modo

#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_:

Io passerei alcuni adattatori tramite parametri di template (non dovrebbero esserci freni lì), ma se vuoi essere così maldestro, puoi farlo anche tu. Fate un collegamento fisso al file di intestazione (mklink /H <link> <target>, se non mi sbaglio. Potete cercare su Google "windows create hard link"). E poi basta collegarlo nel solito modo.

Non hai capito il punto.

 
fxsaber:

Lei non capisce la domanda.

Beh, non so, sei sicuro di aver capito? Nel caso in cui l'elenco sia qq.mqh e ee.mqh (una sola entità, cambiando una si cambia l'altra)

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

Tutto come ordinato, classe non inmacro, quasi lo stesso tranne _M.