Errori, bug, domande - pagina 1838

 

Questo è normale e assolutamente corretto. Avete chiesto la dimensione interna (nessun carico utile) di un oggetto dinamico.

Usa ArraySize per gli oggetti dinamici e applica sizeof solo agli oggetti statici. Sizeof è contato al momento della compilazione ed è sempre una costante.

 
Renat Fatkhullin:

Questo è normale e assolutamente corretto.

Usate ArraySize per gli oggetti dinamici e applicate sizeof solo agli oggetti statici.

Grazie! Si prega di portare l'Aiuto per conformarsi a questa raccomandazione.
 

Leggere la documentazione fino in fondo

Вычисления размера происходит на этапе компиляции.

 

Chiedo aiuto, anch'io sono perplesso. Ho scritto questo script per spiegare.

struct STRUCT 
{
  int a;
};

class CLASS
{
public:
  int a;
};

STRUCT f1()
{  
  static int i = 0;
  
  STRUCT Res;
  
  Res.a = i++;   
  
  return(Res);
}

CLASS* f2()
{
  static int i = 0;
  
  CLASS* Res = new CLASS;
  
  Res.a = i++;
  
  return(Res);
}

void OnStart()
{
  int i1 = f1().a + f1().a;  
  int i2 = f2().a + f2().a;
}

C'è una struttura e c'è una classe simile. Ho bisogno che dopo il calcolo i2, gli oggetti di classe corrispondenti siano cancellati spontaneamente, come succede con gli oggetti struttura, quando viene eseguito lo stesso calcolo i1. Come fare?

 

fxsaber:

Come si fa?

Avvolgilo in un puntatore intelligente, non sono sicuro che possa essere fatto con mql
 
Комбинатор:
Avvolgilo in un puntatore intelligente, non sono sicuro che possa essere fatto da mql
Il problema stesso è causato dall'incapacità di restituire una struttura complessa. Per esempio, se nel codice qui sopra invece di int a; fate stringa a;, allora f1() fallirà al ritorno. Ecco perché i miei occhi sono caduti sulle classi, ma lì mi aspettava la trappola descritta.
 

In generale, potete sovrascrivere il costruttore copy e operator=

Questo non funzionerà per le classi, si suppone che siano restituite solo tramite puntatore, le strutture possono essere restituite tramite valore.

 
Комбинатор:

In generale, potete sovrascrivere il costruttore copy e operator=

Questo non funzionerà per le classi, si suppone che siano restituite solo tramite puntatore, le strutture possono essere restituite tramite valore.

Grazie! Questa soluzione mi è stata impedita da una restrizione recentemente rimossa. Ora funziona
struct STRUCT
{
  string Str;

  template <typename T>
  void operator =( const T Value )
  {
    Print(__FUNCTION__);
  }
  
  void operator =( const STRUCT &Struct )
  {
    this.Str = Struct.Str;
  }
};

STRUCT f()
{
  STRUCT Res;
  
  return(Res);
}

void OnStart()
{
  f() = 1;
}
 

Durante l'ottimizzazione dell'Expert Advisor ottengo il seguente errore

Il (0, 3) testato con errore "errore runtime critico 512 nella funzione OnTimer (la funzione sleep raggiunge la fine del test)" a 0:37:20.429 + sincronizzazione della storia 0:00:43.395

Il test singolo passa senza errori.

La versione di MT5 e MetaEditor è 1571.

 
pivomoe:

Durante l'ottimizzazione dell'Expert Advisor ottengo il seguente errore

L'errore "errore runtime critico 512 nella funzione OnTimer (la funzione sleep raggiunge la fine del test)" a 0:37:20.429 + sincronizzazione della storia 0:00:43.395

Rimuovi la quantità massima di codice dall'Expert Advisor, in modo che l'errore sia riproducibile. E pubblicare il codice rimanente.