Fehler, Irrtümer, Fragen - Seite 2755

 

Compiler-Fehler, funktioniert in älteren Builds einwandfrei.

struct A { };

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

struct C : B<A> { };
 

Ich habe einen solchen einfachen Expert Advisor (siehe Screenshot).

Dem Diagramm sind Diagrammobjekte überlagert.

Vor der gestrigen Aktualisierung des Terminals wurden die Handelsstufen in den Charts angezeigt, aber jetzt sind sie verschwunden.

Ich habe Diagramme erstellt, wie im Beispiel im Handbuch gezeigt. Ich habe keine Diagrammeigenschaften zur Anzeige von Handelsstufen gefunden (nur Basisdiagramme haben eine solche Eigenschaft).

Bitte um Hilfe.

Screenshots von der MetaTrader-Plattform

GBPUSD, M5, 2020.05.25

Forex Club International Limited, MetaTrader 5, Real

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


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

Hallo. Bitte helfen Sie mir zu verstehen, was geschrieben steht.

mqlrate rt [2] ;

Gehe ich recht in der Annahme, dass dies ein Array von zwei Strukturen ist, die automatisch die gleichen Strukturdaten erhalten haben?

Nur weiter gibt es keine Zuweisung von Daten an das Array und dann werden die Daten aus dem Array auf einmal verwendet.
 
Ivan_Invanov:

Hallo. Bitte helfen Sie mir zu verstehen, was geschrieben steht.

mqlrate rt [2] ;

Gehe ich recht in der Annahme, dass dies ein Array von zwei Strukturen ist, die automatisch die gleichen Daten erhalten?

Geschrieben in MQL5:

MqlRates rt[2]

bedeutet: ein statisches Array von zweiMqlRates-Strukturen wird deklariert. Nach der Deklaration können diese Strukturen Kauderwelsch speichern, so dass diese Strukturen explizit mit Daten gefüllt werden müssen.

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

Schreiben in MQL5:

bedeutet: ein statisches Array von zweiMqlRates-Strukturen wird deklariert. Einmal deklariert, können diese Strukturen Kauderwelsch speichern, daher müssen diese Strukturen explizit mit Daten gefüllt werden.

Ich danke Ihnen.
 
Alexey Navoykov:

Compiler-Fehler, funktioniert in älteren Builds einwandfrei.

Ja, so etwas gibt es, berichtet bereits am 25.03.2020, bereits seit 2 Monaten Tag für Tag...
(
nicht behoben durch MT5(build 2390)) (neu) Kompilierfehler bei Verwendung des Standard-Zugriffsmodifikators beim Erben in einer Vorlagenklasse, wenn der Vorlagenparameter als Basisklasse fungiert.

 

Ein weiterer Fehler:

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&)'
}

Er beschuldigt C::operator=, obwohl hier D::operator= ausgeführt wird. Um diesen Fehler zu umgehen, müssen Sie den Operator für alle Basisklassen in der Hierarchie überladen.


p.s. Im Allgemeinen haben die Entwickler versprochen, das falsche Verhalten des Zuweisungsoperators vor langer Zeit zu beheben, aber es ist immer noch da. Das ist ein Skandal. Zum Beispiel kompiliert der folgende Code ohne Fehler, obwohl er zuweist, was auch immer es ist:

#include <Expert\Expert.mqh>

#include <Strings\String.mqh>

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

Ein weiterer Fehler:
1) Es beschwert sich über C::operator=, obwohl hier D::operator= ausgeführt wird. Um diesen Fehler zu vermeiden, müssen wir den Operator für alle Basisklassen in der Hierarchie überladen.
2) Im Allgemeinen haben die Entwickler versprochen, das falsche Verhalten des Zuweisungsoperators vor langer Zeit zu beheben, aber es ist immer noch da - es ist ein Skandal. Zum Beispiel kompiliert der folgende Code ohne Fehler, obwohl er zuweist, was auch immer es ist:

1) Dies ist höchstwahrscheinlich kein Fehler, sondern ein natürliches Verhalten unter Berücksichtigung der Besonderheiten von MQL, nämlich:
In MQL sind Methoden und Felder der Basisklasse von den abgeleiteten Klassen "direkt verfügbar".
Im Wesentlichen ist das Vererbungsverhalten in MQL vergleichbar mit der Verwendung von Deklarationen für jedes Basisfeld und jede Methode 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; 
}



Die Operationd = c;
bezieht also bei der Suche nach der passenden Funktion auch alle operator=-Funktionen aus den Basisklassen mit ein.
Infolgedessen ist die optimale Signatur für einen überladenen Funktionsaufruf die standardmäßige und gelöschte void operator=(const C&).

 
Sergey Dzyublik:

1) Höchstwahrscheinlich handelt es sich nicht um einen Fehler, sondern um ein natürliches Verhalten in Anbetracht der Besonderheiten von MQL, nämlich:
In MQL sind Methoden und Felder einer Basisklasse von Nachfolgeklassen "direkt verfügbar".
Im Wesentlichen ist das Vererbungsverhalten in MQL vergleichbar mit der Verwendung von Deklarationen für jedes Basisfeld und jede Methode in C++.
C++ online:https://onlinegdb.com/rJkckvFsU


So sind alle operator=-Funktionen aus den Basisklassen auch an der Operationd = c;
bei der Suche nach der entsprechenden Funktion beteiligt.
Infolgedessen ist die optimale Signatur für einen überladenen Funktionsaufruf die standardmäßige und entfernte void operator=(const C&).

Man muss nicht in einem offensichtlichen Sprachfehler nach der heiligen Bedeutung suchen. Ich habe dieses Problem bereits hier angesprochen, und Ilyas hat mir versichert, dass es korrigiert werden würde. Aber es sind bereits fast 10 Monate vergangen. (

Im Wesentlichen ist das Vererbungsverhalten in MQL ähnlich wie in C++ mit der Deklaration

Ja, gut, wenn in MQL zum Beispiel 2 x 2 = 5, könnte man sagen, dass es das gleiche wie in C ++ Hinzufügen einer Inkrement-Operation auf das Ergebnis ist)

 
Alexey Navoykov:

Man muss nicht in einem offensichtlichen Fehler in der Sprache nach einer heiligen Bedeutung suchen.

Es wurde Ihnen erklärt, wie und warum es funktioniert, wenn es für Sie schwierig ist - zum Glück kann ich nicht helfen...
Es ist keine heilige Bedeutung, sondern ein üblicher Ansatz, um die Eingabeebene des Benutzers zu senken, damit er auf Felder und Methoden der Basisklasse zugreifen kann, ohne "this" zu verwenden, und auch in Fällen der Überladung einer Basisklassenfunktion.