Errori, bug, domande - pagina 2755

 

Errore del compilatore. Funziona bene nelle vecchie build.

struct A { };

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

struct C : B<A> { };
 

Ho un semplice Expert Advisor (vedi schermata).

Ci sono oggetti Chart sovrapposti al grafico.

Prima dell'aggiornamento del terminale di ieri, i livelli di trading erano mostrati sui grafici, ma ora sono scomparsi.

Ho creato dei grafici come mostrato nell'esempio del manuale. Non ho trovato nessuna proprietà del grafico per visualizzare i livelli di scambio (solo i grafici di base hanno tale proprietà).

Per favore, aiutatemi.

Screenshot della piattaforma MetaTrader

GBPUSD, M5, 2020.05.25

Forex Club International Limited, MetaTrader 5, Real

GBPUSD, M5, 2020.05.25, Forex Club International Limited, MetaTrader 5, reale


Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
  • www.mql5.com
//| Создает объект "График"                                          |               chart_ID=0,                               sub_window=0,                             x=0,                                      y=0,                                      width=300,                                height=200,               ...
 

Ciao. Per favore, aiutatemi a capire ciò che è scritto.

mqlrate rt [2] ;

Ho ragione nel supporre che questo sia un array di due strutture che hanno ricevuto automaticamente gli stessi dati della struttura?

Inoltre non c'è alcuna assegnazione di dati all'array e poi i dati dell'array vengono usati in una volta sola.
 
Ivan_Invanov:

Ciao. Per favore, aiutatemi a capire ciò che è scritto.

mqlrate rt [2] ;

Ho ragione nel supporre che questo sia un array di due strutture che hanno ricevuto automaticamente gli stessi dati?

Scritto in MQL5:

MqlRates rt[2]

significa: viene dichiarato un array statico di due struttureMqlRates. Dopo la dichiarazione, queste strutture possono memorizzare cose senza senso, quindi queste strutture devono essere esplicitamente riempite di dati.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Константы, перечисления и структуры / Структуры данных / Структура исторических данных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Scrivere in MQL5:

significa: viene dichiarata una matrice statica di due struttureMqlRates. Una volta dichiarate, queste strutture possono memorizzare gibberish, quindi queste strutture devono essere esplicitamente riempite di dati.

Grazie.
 
Alexey Navoykov:

Errore del compilatore. Funziona bene nelle vecchie build.

Sì, c'è una cosa del genere, riportata già nel 2020.03.25, già giorno per giorno per 2 mesi...
(
non risolto da MT5(build 2390)) (nuovo) Errore di compilazione, quando si usa il modificatore di accesso predefinito quando si eredita in una classe template, quando il parametro template funge da classe base.

 

Un altro bug:

class A
{
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
};

class D : public C
{
 public:
  void operator=(A const& other) { }
};

void OnStart()
{
  C c;
  D d;
  d = c; // attempting to reference deleted function 'void C::operator=(const C&)'
}

C::operator=, anche se D::operator= viene eseguito qui. Per aggirare il bug, dovete sovraccaricare l'operatore per tutte le classi base nella gerarchia.


p.s. In generale, gli sviluppatori hanno promesso di correggere il comportamento scorretto dell'operatore di assegnazione molto tempo fa, ma è ancora lì. Questo è un oltraggio. Per esempio, il seguente codice si compila senza errori anche se sta assegnando qualcosa:

#include <Expert\Expert.mqh>

#include <Strings\String.mqh>

void OnStart()
{
  CExpert Expert;
  CString String;
  Expert = String; // Ошибки нет. Типа всё нормально?
}
 
Alexey Navoykov:

Un altro bug:
1) Si lamenta di C::operator=, anche se D::operator= viene eseguito qui. Per evitare il bug, dobbiamo sovraccaricare l'operatore per tutte le classi base nella gerarchia.
2) In generale, gli sviluppatori hanno promesso di correggere il comportamento scorretto dell'operatore di assegnazione molto tempo fa, ma è ancora lì - è un oltraggio. Per esempio, il seguente codice si compila senza errori anche se assegna qualsiasi cosa:

1) Questo molto probabilmente non è un bug ma piuttosto un comportamento naturale considerando le specificità di MQL, cioè:
In MQL, i metodi e i campi della classe base sono "direttamente disponibili" dalle classi derivate.
In sostanza, il comportamento dell'ereditarietà in MQL è simile all'uso della dichiarazione per ogni campo e metodo di base in C++.
C++ online:https://onlinegdb.com/rJkckvFsU

class A
{
public:
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
public:
    //void operator=(C const& other) { printf("C");}
};

class D : public C
{
public:
#ifdef __cplusplus
  using A::operator=;
  using B::operator=;
  using C::operator=;
#endif
  void operator=(A const& other) { printf("D");}
};

void OnStart()
{
  C c;
  D d;
  d = c; 
}



Così, tutte le funzioni operator= delle classi base sono anche coinvolte nell'operazioned = c;
quando si cerca la funzione appropriata.
Di conseguenza, la firma ottimale per una chiamata di funzione sovraccaricata è quella predefinita e cancellata void operator=(const C&).

 
Sergey Dzyublik:

1) Molto probabilmente, non è un bug, ma un comportamento naturale considerando le peculiarità di MQL, cioè:
In MQL, i metodi e i campi di una classe base sono "direttamente disponibili" dalle classi discendenti.
In sostanza, il comportamento dell'ereditarietà in MQL è simile all'uso della dichiarazione per ogni campo e metodo di base in C++.
C++ online:https://onlinegdb.com/rJkckvFsU


Così, l'operazioned = c;
coinvolge anche tutte le funzioni operator= delle classi base quando si cerca la funzione appropriata.
Di conseguenza, la firma ottimale per una chiamata di funzione sovraccaricata è il predefinito e remoto void operator=(const C&).

Non c'è bisogno di cercare un significato sacro in un difetto evidente della lingua. Ho già sollevato questo problema qui e Ilyas ha assicurato che sarà risolto. Ma sono già passati quasi 10 mesi. (

In sostanza, il comportamento dell'ereditarietà in MQL è simile a quello in C++ usando la dichiarazione

Sì, beh, se in MQL per esempio 2 x 2 = 5, si potrebbe dire che è lo stesso che in C++ aggiungendo un'operazione di incremento al risultato)

 
Alexey Navoykov:

Non è necessario cercare un significato sacro in un difetto evidente della lingua.

Ti è stato spiegato come e perché funziona, se è difficile per te - per fortuna non posso aiutarti...
Non è un significato sacro, ma un approccio comune per abbassare il livello di input dell'utente, in modo che possa accedere a campi e metodi della classe base senza usare "this.", e anche nei casi di sovraccarico di una funzione della classe base.