Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 113

 
pavlick_:

Ich wüsste nicht, warum meine Lösung schlechter sein sollte, ich werde sie auch hier einfügen:

Denn ursprünglich war es eine "Schau, wie ich es mache"-Vorstellung, und sie erforderte genau die Lösung, die man sich vorher ausgedacht hatte. Und Ihre haben nicht in die Produktion gepasst.

Aber selbst der Regisseur hat nicht bedacht, dass die Reihenfolge der Berechnung der Parameter laut den Unterlagen nicht garantiert ist

 
A100:

Aber selbst der Direktor hat nicht berücksichtigt, dass die Reihenfolge der Berechnung der Parameter laut der Dokumentation nicht garantiert ist.

Um fair zu sein, die MQL-Dokumentation beschreibt dies:

Hinweis

Beachten Sie, dass die Parameter in umgekehrter Reihenfolge an die Funktion übergeben werden, d. h. der jüngste Parameter wird zuerst berechnet und übergeben, dann der vorletzte und so weiter. Der Parameter, der nach der öffnenden Klammer an erster Stelle steht, wird berechnet und zuletzt übermittelt.

Aus Sicht von C++ ist das sicherlich verrückt, aber wenn es eine dokumentierte Regel in MQL ist, könnte es in Ordnung sein, wenn Sie nicht vorhaben, Ihren Code in Zukunft zu portieren. Und wenn Sie das tun, können Sie diesen Platz sichern, indem Sie #ifdef __MQL__ überprüfen.

 
A100:

Die Reihenfolge, in der die Parameter berechnet werden, ist nicht garantiert

Ich habe gerade auf Ihren Link geachtet. In der Tat, es ist nicht garantiert. Was für eine widersprüchliche MMS ))

 
Alexey Navoykov:

Gerade jetzt bezahlt Aufmerksamkeit auf Ihren Link. In der Tat, es ist nicht garantiert dort. Das ist die umstrittene MQL ))

Auf x32 umgekehrt (ich denke, es wird speichern), denn es gibt eine direkte Verbindung zum Stapel. Während bei x64 der umgekehrte Weg keinen Sinn macht und es deshalb keine Garantien für die Zukunft gibt... außerdem sieht es dort unnatürlich aus

Es würde mich nicht einmal überraschen, wenn die Reihenfolge mit und ohne Optimierung unterschiedlich ist.

 

Für alle angebotenen Optionen möchte ich mich bedanken. Sie haben einen konstruktiven Beitrag zur Lösung eines praktischen Problems geleistet.


Die Aufgabe wurde gut demonstriert, dass sie nicht funktionieren würde, wenn ungültig TimeCurrent() würde fehlschlagen. Die Leere in ihrer jetzigen Form ist in der Lage, viele Dinge zu verkrüppeln.

 

Ich möchte die übergeordnete Methode aufrufen

Hier ist der Code, was mache ich falsch?

//+------------------------------------------------------------------+
class A
  {
public:
   virtual int Test_A()
     {
      return 100;
     }
  };
//+------------------------------------------------------------------+
class B :public A
  {
public:
   virtual int Test_A()
     {
      return 200;
     }
  };

B b;
//+------------------------------------------------------------------+
void OnStart()
  {
   Comment (A::b.Test_A());
  }
//+------------------------------------------------------------------+


 
Vladimir Pastushak:

Ich möchte eine übergeordnete Methode aufrufen

die korrekte Syntax lautet wie folgt:

b.A::Test_A()

aber bei mql gibt es weder richtig noch falsch.

Aber die Frage ist eher an Sie gerichtet - wenn eine Funktion von einer abgeleiteten Funktion aufgerufen werden muss, warum sollte sie dann in eine virtuelle Basisfunktion eingefügt werden?

 

fxsaber:

Die Aufgabe zeigte deutlich, dass, wenn die ungültig TimeCurrent() aufgerufen wurde, würde nichts funktionieren. Die Leere in ihrer jetzigen Form ist in der Lage, eine Menge Dinge zu verstümmeln.

Auf einen Blick:

#define  MACROSV(NEW_HANDLE_, VOIDFN_) \
do{                                   \
   int prev=GetHandle();              \
   if(SelectHandle(NEW_HANDLE_))      \
      VOIDFN_;                        \
   SelectHandle(prev);                \
}while(false)

Zwei Makros scheinen nicht viel zu schaden. Etwas Eleganteres, mit der Kraft von μl, fällt mir nicht ein.

 
pavlick_:

Aus dem Stegreif:

Die geschweiften Klammern allein reichen schon aus, um...
 
Alexey Navoykov:
Die geschweiften Klammern allein reichen schon aus, um...

Damit es funktioniert:

if(...)
   MACROSV(...);
else
{
}