Errori, bug, domande - pagina 2682

 

Bug MT5 (build 2367) Le priorità di esecuzione delle funzioni template in MQL non corrispondono a quelle in C++ (online: https://onlinegdb.com/B172m1PLL).
Sembra che come parte della correzione del bug, il bug di compilazione sia risolto, ma la priorità di esecuzione delle funzioni template sovraccaricate non è ancora allineata con il comportamento del C++.

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};

                                         
struct AA{
public:
   static void test(B<int>& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   
   A<B<int>>::test(bb);         // MQL:2,  should be 1     
   AA::test(bb);                // MQL:2,  should be 1     
}
 

Mi sono imbattuto in uno strano problema. È impossibile passare un tipo template con diversi tipi-parametri in una macro, perché il preprocessore non sa che si tratta di un template e considera i parametri per virgole.

Ho trovato la descrizione del problema e la sua soluzione per C++ nel SO.

#define  COMMA ,
#define  XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

Ho provato in MQL, ma purtroppo non ha funzionato. Il compilatore dà un errore "identificatore non dichiarato" per una variabile descritta dal tipo passato.

Sono riuscito con una classe derivata aggiuntiva per ora, ma posso risolvere il problema in C++?

Ops. Ho trovato una soluzione. Ecco come funziona:

#define  COMMA() ,
La domanda viene rimossa.
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

Bug MT5 (build 2367) la posizione delle funzioni template sovraccaricate influenza il risultato della compilazione.
Il biglietto originale con cui è stato fatto il lavoro -https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++ online(https://onlinegdb.com/BJzbH2DLL).


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

Difetti nel funzionamento della cache della funzione template/classe:
(corretto da MT5(build 2368)) ***(up) Undefined Behavior, si crea un oggetto complesso avvolto con tipo interno "C" più volte e si scopre che è un tipo di dati completamente diverso, forse "B", forse "int", quello che vuoi...
(corretto da MT5(build 2368)) * Errore di compilazione, bug sul passaggio di un puntatore di funzione come argomento const ref template.
(corretto da MT5(build 2368)) * Errore di compilazione, l'oggetto B<int> può essere creato dopo l'oggetto B<void*>, ma si verifica un errore di compilazione se viene fatto prima.


Difetti nella funzione template/classe di lavoro:
(corretto da MT5(build 2368)) ***(su) Errore di compilazione, bug all'interno della funzione template, il puntatore passato all'interno dellaconversione esplicita del tipo si comporta altrimenti come una classe.
(corretto da MT5(build 2368)) ** Erroredi compilazione, bug nel tentativo di accedere alla classe interna per un parametro template di una funzione template.
(non corretto da MT5 (build 2368)) *** Errore di compilazione, la lamentela principale è un avvertimento di output inappropriato - "comportamento deprecato, la chiamata al metodo nascosto sarà disabilitata in una futura versione del compilatore MQL". L'attuale implementazione sta sparando agli uccelli con una piuma.
(non corretto da MT5 (build 2368)) ** Errore di compilazione, il bug riguarda il valore di ritorno di una funzione template quando il valore di ritorno è una classe interna ad una classe template il cui tipo di parametro è impostato dal tipo di argomento della funzione template.
(non corretto da MT5 (build 2368)) ** Errore di compilazione, bug dello spazio dei nomi e dell'ambito nel costruttore di template quando si chiama una classe base quando lo stesso nome di classe è usato nell'ereditarietà e nella classe interna.
(non corretto da MT5 (build 2368)) * Errore di compilazione, bug sulla chiamata della funzione template con tipi di argomento espliciti quando viene chiamata da una funzione non template sovraccaricata.
(non risolto da MT5(build 2368)) Errore di compilazione, bug sulla definizione interna della classe - nessun riferimento allo spazio dei nomi globale quando si definisce una classe base.
(corretto da MT5(build 2368)) ** Errore di compilazione, bug con la generazione di codice di classe template quando si usa una classe interna.
(corretto da MT5(build 2368)) ** Errore di compilazione, bug sulla generazione del metodo/classe del template, il processo di sostituzione automatica del parametro del template è al di fuori dello scopo nel codice del programma principale.
(corretto da MT5(build 2368)) * Errore di compilazione, bug con assenza di codice di classe template autogenerante quando la classe template agisce come valore di ritorno per il metodo template.
(corretto da MT5(build 2368)) * Errore di compilazione, bug nel passare una struct interna a una funzione template, iltipo di dati risultante non può essere usato come tipo di dati di base per un'altra struct interna nella classe template.
(corretto da MT5(build 2368)) * Errore di compilazione, il controllo dei nomi dei tipi di template riutilizzati non viene eseguito quando si dichiara una funzione template all'interno di una classe template, il che porta a un comportamento inaspettato.
(corretto da MT5(build 2368)) Errore di compilazione, difetti multipli relativi al ritorno dell'oggetto "in luogo creato" quando l'oggetto è una classe/struttura modello.
(non corretto da MT5 (build 2368)) *( Non è un bug, è una caratteristica) nel costruttore della classe base è impossibile eseguire un typecast esplicito sulla conversione del puntatore all'oggetto della classe base nel puntatore alla classe madre.


Difetti legati all'incoerenza nelle priorità delle chiamate di funzioni sovraccaricate in MQL rispetto al C++:
(corretto da MT5(build 2368)) **(up) Errore di compilazione, la priorità di chiamata delle funzioni template sovraccaricate dipende in realtà dal tipo di parametro template, che teoricamente non influenza il risultato della compilazione.
(corretto da MT5(build 2368)) ** Erroredi compilazione quando la prima funzione template sovraccaricata usa una classe base template completamente specializzata e la seconda usa una classe base template non specializzata.
(non corretto da MT5 (build 2368)) ** Errore di compilazione, un errore di compilazione si verifica durante la generazione di codice per una funzione template nonostante il fatto che ci sia una funzione template sovraccaricata con una firma adatta ai parametri passati.
(non corretto da MT5 (build 2368)) * Errore di compilazione, "chiamata ambigua a funzione sovraccaricata" quando vengono chiamate funzioni template sovraccaricate con diverso numero di parametri template.
(corretto da MT5(build 2368)) *** Errore di compilazione quando si ereditano le classi A <= B <= C <= D e si implementano due funzioni di sovraccarico, per esempio, una con parametro A* e la seconda con parametro B*, quindi il passaggio di un oggetto C* o D* in tale funzione in MQL causa un errore di compilazione "ambiguous call to overloaded function".
(corretto da MT5(build 2368)) ** Runtime, mismatch di priorità per le chiamate di funzioni template sovraccaricate.

Difetti relativi all'esecuzione lenta delle funzioni, prestazioni dell'ottimizzatore di codice:
(corretto da MT5(build 2368)) ** Runtime, grande overhead quando si aggiunge un elemento alla volta in un array usando ArrayResize, nonostante il fatto che la memoria per loro sia stata riservata, per esempio, le strutture sono fino a 7 volte più lente.


Suggerimenti:
(nuovo) link - sull'implementazione del supporto intellisense per la funzionalità dello spazio dei nomi basato sul lavoro intellisense per i metodi statici nelle classi.
link- per permettere ai letterali e alle variabili temporanee di essere passati come argomenti di funzioni const ref.
link- quandosi spostano i file del progetto nella scheda Progetto, per i file spostati che sono aperti e nelle schede ME, per aggiornare automaticamente il loro percorso.
link- per introdurre la funzionalità della dichiarazione typedef in MQL.
link- circa la possibilità di forzare la generazione di costruttori di copia e operatori di assegnazione predefiniti.

 
Bug MT5 (build 2368) errore di compilazione quando si usa un modificatore di accesso predefinito durante l'ereditarietà in una classe template, quando il parametro template agisce come classe base.
Tutto funzionava prima, apparentemente qualcosa si è rotto come parte della correzione di altri bug.

class A{};

template<typename T>
class B : T{};            //'A' - unexpected token      

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

Bug MT5 (build 2368) errore di compilazione quando si chiama la dichiarazione di assegnazione tramite indicazione esplicita della classe base. Il problema si verifica peruna classe template con parametro template come classe base.
Prima funzionava, apparentemente qualcosa si è rotto come parte della correzione di altri bug.

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
L'aggiornamento MT5 di tutti dal 08.03.2020 ha iniziato ad avere una storia di trade che salta?
File:
 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2020.03.22 10:04

mq5 è ok. mq4 è rotto. Potete prendere TypeToBytes_ExampleScript.mq4 da qui. Si compila solo se si cambia l'estensione in mq5.

2368 - non è cambiato nulla.

 

Attraverso un terminale MT5 potevo sempre accedere al conto di qualsiasi broker. Se c'era un problema con il primo login, ho semplicemente usato gli strumenti del Terminale per cercare il broker appropriato, ottenendo automaticamente i dati dei suoi server di trading. Dopo di che ho potuto accedere senza problemi.


Oggi ho affrontato una situazione per la prima volta (nuovo broker), che nulla aiuta. Non posso accedere. In log scrive.

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


Ho scaricato il terminale nativo del broker - accede immediatamente. Il mio terminale di ricerca - non esiste. Per la prima volta tale.

Potete dirmi come fare in modo che un terminale non nativo sia in grado di connettersi al conto di trading?

 
fxsaber:

Potete dirmi come fare in modo che un terminale non nativo sia in grado di connettersi a un conto di trading?

In mt4 ho dovuto copiare il file server.ini in un altro terminale, in modo da non dover cercare i server commerciali

non so in mt5