OOP, Vorlagen und Makros in mql5, Feinheiten und Anwendungen - Seite 18

 
fxsaber:
#define  p_func(NAME)  Print(#NAME " = " ,NAME)
//+------------------------------------------------------------------+
void OnStart()
{  int QWERTY=100;
   int zxcvbn=999;
   p_func(QWERTY);   // QWERTY = 100
   p_func(zxcvbn);   // zxcvbn = 999

}
//+------------------------------------------------------------------+

Es funktioniert!

Ich danke Ihnen!

 

Helfen Sie mir, dieses Problem zu lösen. Es gibt ein Makro, in das ich Code einfügen möchte, um das Ergebnis zurückzugeben.

#define  FOR3(a,b,c,loop) {for(int i=0; i<a; i++)\
for(int j=0; j<b; j++)\
for(int k=0; k<c; k++)\
{loop;}/*код хочу дописать в этом месте и вернуть результат но эта штука работает только как void*/}

Ist es möglich, an der angegebenen Stelle Code hinzuzufügen, so dass ich das Ergebnis aus dem Makro zurückgeben kann? Sie können den Code hinzufügen; ich habe es versucht, aber wenn Sie return schreiben, wird der Effekt nicht erwartet. Ich habe dieses Beispiel gesehen

  double Try_helper;
#define  Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0) {          \
     printf("Error: %s ", MES);      \
     return 4;                         \
   }

hier in dem Thread, in dem die Rückgabe funktioniert.

 
Seric29:

Helfen Sie mir, dieses Problem zu lösen. Es gibt ein Makro, in das ich Code einfügen möchte, um das Ergebnis zurückzugeben.

Ist es möglich, an der angegebenen Stelle Code hinzuzufügen, so dass ich das Ergebnis aus dem Makro zurückgeben kann? Sie können den Code hinzufügen; ich habe es versucht, aber wenn Sie return schreiben, wird der Effekt nicht erwartet. Ich habe dieses Beispiel gesehen

hier in dem Thema, wo die Rückgabe funktioniert.

Aufruf einer Funktion, in der Sie einen Zeiger auf eine andere Funktion übergeben (z. B. den Schleifenkörper)

int for3(int a, int b, int c, void(*loop)()) {
        for(int i=0; i<a; i++)
                for(int j=0; j<b; j++)
                        for(int k=0; k<c; k++) 
                                loop();
        return 4;
}
...
void fn() {}
...
if ( for3(1, 2, 3, fn) ) printf("hellow world");
 
Vict:

Aufruf einer Funktion, in der Sie einen Zeiger auf eine andere Funktion übergeben (z. B. den Körper einer Schleife)

Ich wusste nicht, dass es möglich ist, dies zu tun, aber mein Ziel ist es, ein komplexes mehrzeiliges Makro zu schreiben, das viele Befehle ausführt, wahrscheinlich kann ein Makro nicht viele Befehle ausführen und es zu einer Funktion zu machen ist nicht möglich? Manchmal ist es notwendig, z.B. eine Schleife aus einer Funktion zu extrahieren. Ich frage mich, ob das möglich ist, vielleicht schreibe ich ja Unsinn.

 
Seric29:

Ich wusste nicht, dass es möglich ist, so etwas zu tun, aber meine Aufgabe ist es, ein komplexes mehrzeiliges Makro zu schreiben, das viele Befehle ausführt, wahrscheinlich kann ein Makro nicht viele Befehle ausführen und es ist unmöglich, eine Funktion daraus zu machen? Manchmal ist es notwendig, aus einer Funktion eine Schleife zu machen, ich frage mich, ob das möglich ist, vielleicht schreibe ich auch nur Unsinn.

Ich weiß nicht, was die Aufgabe ist und ob Sie dort graben, aber auf den ersten Blick - ein anderer Ansatz:

#define  CHECKCONT_INST(_NAME)                            \
bool _NAME(upindex_t start, upindex_t top)               \
   double lev_k[] = {CHECKCONT_INST_LEVELS};             \
   ...                                                   \
}                                                        \

#define  CHECKCONT_INST_LEVELS
CHECKCONT_INST(check_cont_withoutlev);
#undef  CHECKCONT_INST_LEVELS

#define  CHECKCONT_INST_LEVELS 1.618
CHECKCONT_INST(check_cont_1618);
#undef  CHECKCONT_INST_LEVELS

#define  CHECKCONT_INST_LEVELS 1.618, 2.618
CHECKCONT_INST(check_cont_2618);
#undef  CHECKCONT_INST_LEVELS

check_cont_withoutlev(0, 10);
check_cont_1618(0, 10);
check_cont_2618(0, 10);

Auf diese Weise können Sie jedes Stück Funktion (nicht notwendigerweise Array-Füllung, wie es in meinem Fall ist) und instanziieren es nach Bedarf ersetzen.

 
#define  FOR3(a,b,c,code)   \
for(int i=0; i<a; i++)     \
for(int j=0; j<b; j++)     \
for(int k=0; k<c; k++){    \
code;                      \
}

void OnStart(){

   string x="";
   FOR3(2,3,4,x=x+(string)i+","+(string)j+","+(string)k+";\n");   
   Alert(x);
   
}
 
Seric29:

Ich wusste nicht, dass es möglich ist, dies zu tun, aber meine Aufgabe ist es, ein komplexes mehrzeiliges Makro zu schreiben, das viele Befehle ausführt, ich schätze, ein Makro kann nicht viele Befehle ausführen und es zu einer Funktion zu machen ist nicht möglich? Manchmal muss ich aus einer Funktion eine Schleife machen, ich frage mich, ob das möglich ist, vielleicht schreibe ich auch nur Unsinn.

Das ist möglich, aber nicht auf diese Weise.

 
Dmitry Fedoseev:

Sie können, aber nicht so.

Dieses Makro wird ungültig sein, um ein Ergebnis zurückzugeben, muss ein Ausdruck berechnet werden, mit anderen Worten, Sie müssen eine Funktion darin aufrufen, zu diesem Schluss bin ich gekommen.

 
Vict:

Aufruf einer Funktion, in der Sie einen Zeiger auf eine andere Funktion übergeben (z. B. den Schleifenkörper)

Ich studierte eine Funktion Zeiger, um ehrlich zu sein habe ich nie verstanden, was es für, in der Tat können Sie eine Funktion anstelle einer Variable kann mir eng kommen, eine Funktion Zeiger ähnelt einer Überlastung oder Polymorphismus.

 
Seric29:

Ich habe den Funktionszeiger studiert, um ehrlich zu sein habe ich nicht verstanden, wofür er ist, im Grunde kann man eine Funktion anstelle einer Variablen aufrufen, vielleicht habe ich eine harte Zeit, der Funktionszeiger ist wie eine Überladung oder Polymorphismus.

Sie haben einen Algorithmus, in den Sie sozusagen einen Unteralgorithmus einbauen können, um ihn zur Lösung eines bestimmten Problems zu "optimieren". Im Wesentlichen handelt es sich um eine Analogie zu den virtuellen Funktionen. Die Hauptsache ist, dass Sie selbst darum gebeten haben und jetzt nicht wissen, warum)), Sie hatten einen Rahmen, in den Sie eine Schleife gelegt haben.