Errori, bug, domande - pagina 2679

 
fxsaber:

2365 - il codice era cosparso di errori. Non ho ancora avuto il tempo di capirlo. Ho fatto un rollback a 2361 - era ok. In mq4 - stessa situazione.

Grazie per il messaggio, controllerò

 
Ho scaricato una nuova versione di MT5 (build 2365), purtroppo qualcosa è rotto,
Sembra essere nel passaggio dei parametri quando si chiama il costruttore della classe base.
 
Sergey Dzyublik:
Bug MT5 (build 2365) Errore di compilazione sulla chiamata implicita del costruttore alla classe che usa l'operatore di assegnazione, quando il puntatore che passa per riferimento è usato come argomento del costruttore.
Se il passaggio di un puntatore per riferimento è sostituito dal passaggio di un valore, tutto funziona.

Grazie per il post, risolto

 

Bug MT5 (build 2365) errore di compilazione quando si chiama il costruttore della classe base quando il parametro template della classe template è usato come classe base.
Nessun problema in MT5 (build 2363).

class B;

template<typename T>
class A : public T{
public:
   A() : T(){}   // 'B' - identifier expected
};


class B{};

void OnStart(){
   A<B> a;
};
 
Ilyas:
Possiamo vedere che ArrayResize per gli oggetti è più veloce ora.
Ancora una volta, la complessità di una parte della funzione ArrayResize è stata ridotta da logaritmo a zero

Grazie mille per aver velocizzato ArrayResize per la memoria riservata.
MT5 (build 2365) su un progetto reale std::vector::push_back è 1,5 volte più veloce della build precedente.
E il ritardo di std::vector:resize è diminuito da 2,2 volte a 1,45 volte.

 

build 2366, penso che le costanti non funzionino correttamente ora

class A
{
private:
   int               f1(){Print(__FUNCTION__); return(1);}
   int               f2(){Print(__FUNCTION__); return(2);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};

A a1,a2;
//+------------------------------------------------------------------+
void OnStart()
{
   Print("1. ",a1.func(1));
   Print("2. ",a1.func(2));
   Print("3. ",a2.func(3));
   Print("4. ",a2.func(4));
}
//+------------------------------------------------------------------+

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

se sostituite const con static , funzionerà come previsto - una chiamata a f1() e f2() durante l'inizializzazione di a e b

  int               func(int v){static int a = f1(); static int b = f2(); return(a+b+v);}

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

 

Se si scrive codice come questo, è un bug totale che non può essere catturato

class A
{
private:
   int               f1()const {static int v1=1; Print(__FUNCTION__); return(v1++);}
   int               f2()const {static int v2=1; Print(__FUNCTION__); return(v2++);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};
 
Igor Makanu:

build 2366, penso che le costanti non funzionino correttamente ora

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

se sostituite const con static , funzionerà come previsto - una chiamata a f1() e f2() durante l'inizializzazione di a e b

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

Questo è esattamente il modo in cui dovrebbe funzionare.

 
Igor Makanu:

Se scrivete del codice in questo modo, è un bug totalmente non rilevabile.

Anche qui tutto è corretto.

 
Koldun Zloy:

Questo è esattamente il modo in cui dovrebbe funzionare.

L'anno scorso non ha funzionato così - ho testato appositamente i modificatori di cost

e sembra che@Ilyas abbia spiegato come eseguire un programma MQL, prima tutti i const e static sono inizializzati, non importa dove sono descritti, e poi i costruttori di classe sono chiamati

ok, con questa inizializzazione static / const - può ancora essere distribuito correttamente, ma il fatto che il modificatore const non garantisce che il compilatore controlli questo è molto inaspettato - il mio secondo esempio