Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 112

 
Alexey Navoykov:
Übrigens bin ich zu dem Schluss gekommen, dass im allgemeinen Fall, wenn der Rückgabetyp der Funktion ein absolut beliebiger Typ ist, das Problem nicht mit MQL-Mitteln gelöst werden kann. Erfordert decltype, das hier nicht vorhanden ist.

Der Zeiger wird zurückkehren, aber die Struktur - das glaube ich nicht. Schließlich sollte es sich um einen Verweis handeln.

 
fxsaber:

Es ist das Gleiche.

Jetzt werden 2 statt 3 Argumente an die Funktion übergeben:

MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)
 
Alexey Navoykov:

Jetzt werden in der Regel 2 statt 3 Argumente an die Funktion übergeben:

Zwei sind das eigentliche Problem. Und drittens ist es die Verallgemeinerung.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Irrtümer, Fragen

fxsaber, 2018.12.21 22:15

Lassen Sie mich klarstellen, dass NewHandle - eine Konstante sein kann. D.h. gültiger Anruf
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.
Aus den Beispielen geht klar hervor, was von dem Makro verlangt wird.
 

Der C++-Standard legt diese Reihenfolge nicht fest und überlässt sie dem Compiler. Der MMS-Entwickler muss sich vergewissern, ob diese Reihenfolge geändert werden kann oder ob es Pläne gibt, sie in Zukunft zu ändern.

Daher ist dies der beste Weg, dies zu tun:

template <typename T1, typename T2>
T2 MacrosFunc( const T1 handle, const T2 Value )
{
  SelectHandle(Memory(handle, false));
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(A,  SelectHandle(Memory(A)) ? (B) : NULL)
 
Alexey Navoykov:

Der C++-Standard legt diese Reihenfolge nicht fest und überlässt sie dem Compiler. Der MMS-Entwickler muss sich vergewissern, ob diese Reihenfolge geändert werden kann oder ob es Pläne gibt, sie in Zukunft zu ändern.

Dieser Weg ist also besser:

Ja, sie ist zuverlässiger.

 

Ich bin am Arsch, liebe Redaktion.

Die Übergabe von Code an einen Interpreter, ohne zu wissen, wie der Interpreter den Code interpretieren wird... Der Königsweg.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2018.12.21 10:23

Ich kann es nicht herausfinden, bitte um einen Hinweis. Es gibt einen solchen Zeiterwerb

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


Wie man ein Makro schreibt, das dasselbe tut

time = MACROS(NewHandle, TimeCurrent()); // Макрос


Das Problem ist, dass PrevHandle nicht im Makro erstellt wird.

Ich verstehe nicht, warum meine Lösung schlechter ist, ich werde sie auch hier einfügen:

//handle_t MACROS_helper_PrevHandle;
int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define  MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)

Bemerkenswert - Implementierung des Komma-Operators durch den Trend-Operator (nun ja, nichts Brillantes, aber es ist das erste Mal, dass ich darauf gestoßen bin).

Es ist nicht klar, warum ein Grifftyp durch eine Schablone gezogen wird. Wenn es verschiedene Arten von Griffen gibt, ist das keine große Sache. Und im Allgemeinen wird der Handle-Typ über typedef/define angegeben.

 
pavlick_:

Ich sehe nicht, dass meine Lösung schlechter ist, ich werde sie auch hier einfügen:

Bemerkenswert - Implementierung des Komma-Operators durch den Trend-Operator (na ja, nichts Großartiges, aber es ist das erste Mal, dass ich darauf gestoßen bin).

Es ist nicht klar - warum sollten wir einen Grifftyp durch eine Vorlage ziehen? Wenn es verschiedene Arten von Griffen gibt, ist das keine große Sache. Und im Allgemeinen wird der Handle-Typ über typedef/define angegeben.

Das ist überhaupt nicht gut. Was ist ein Griff?

 
Алексей Тарабанов:

Das ist überhaupt nicht gut. Was ist ein Griff?

Die Aufgabenstellung lautete: Es gibt eine Umgebung, die sich über einen Deskriptor (Handle) ändert, und man muss sie in einem Makro implementieren:

1. Merken Sie sich den aktuellen Griff

2. Schalten Sie die Umgebung auf den neuen Griff um

3. Holen Sie sich den gewünschten Parameter aus der Umgebung

4. Umgebung zum alten Griff wechseln

5. Rückgabeparameter

 
pavlick_:

Die Aufgabenstellung lautete: Es gibt eine Umgebung, die sich über einen Deskriptor (Handle) ändert, und man muss sie in einem Makro implementieren:

1. Merken Sie sich den aktuellen Griff

2. Schalten Sie die Umgebung auf den neuen Griff um

3. Holen Sie den gewünschten Parameter aus der Umgebung

4. Ändern Sie die Umgebung auf den alten Griff

5. Rückgabeparameter

Ich danke Ihnen für Ihre Antwort.