OOP, templates et macros dans mql5, subtilités et utilisations - page 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

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

ça marche !

Merci !

 

Aidez-moi à résoudre ce problème. Il y a une macro et je veux y ajouter du code pour renvoyer le résultat.

#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*/}

Est-il possible d'ajouter du code à l'endroit indiqué pour que je puisse retourner le résultat de la macro ? Vous pouvez ajouter le code ; je l'ai essayé mais si vous écrivez return, l'effet n'est pas attendu. J'ai vu cet exemple

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

ici dans le fil où le retour fonctionne.

 
Seric29:

Aidez-moi à résoudre ce problème. Il y a une macro et je veux y ajouter du code pour renvoyer le résultat.

Est-il possible d'ajouter du code à l'endroit indiqué pour que je puisse retourner le résultat de la macro ? Vous pouvez ajouter le code ; je l'ai essayé mais si vous écrivez return, l'effet n'est pas attendu. J'ai vu cet exemple

ici dans le sujet où le retour fonctionne.

Appeler une fonction dans laquelle vous passez un pointeur à une autre fonction (corps de boucle, par exemple)

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:

Appeler une fonction dans laquelle vous passez un pointeur à une autre fonction (le corps d'une boucle, par exemple).

Je ne savais pas qu'il était possible de faire cela, mais mon but est d'écrire une macro complexe de plusieurs lignes qui exécutera de nombreuses commandes, probablement une macro ne peut pas exécuter de nombreuses commandes et en faire une fonction n'est pas possible ? Parfois on a besoin d'extraire par exemple une boucle d'une fonction, je me demandais si c'était possible, peut-être que j'écris n'importe quoi.

 
Seric29:

Je ne savais pas qu'il était possible de faire une telle chose, mais ma tâche est d'écrire une macro complexe de plusieurs lignes, qui exécutera de nombreuses commandes, probablement une macro ne peut pas exécuter de nombreuses commandes et en faire une fonction est impossible ? Parfois, il est nécessaire de faire une boucle à partir d'une fonction, je me demande si c'est possible, peut-être que j'écris n'importe quoi.

Je ne sais pas quelle est la tâche et si vous y creusez, mais à vue de nez - une autre approche :

#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);

De cette façon, vous pouvez remplacer n'importe quel morceau de fonction (pas nécessairement le remplissage de tableau comme c'est le cas dans mon affaire) et l'instancier selon les besoins.

 
#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:

Je ne savais pas qu'il était possible de faire une telle chose, mais ma tâche est d'écrire une macro complexe de plusieurs lignes, qui exécutera de nombreuses commandes, probablement une macro ne peut pas exécuter de nombreuses commandes et en faire une fonction est impossible ? Parfois, je peux avoir besoin de faire une boucle à partir d'une fonction, je me demande si c'est possible, peut-être que j'écris n'importe quoi.

C'est possible, mais pas comme ça.

 
Dmitry Fedoseev:

Tu peux, mais pas comme ça.

Cette macro sera nulle, pour qu'elle renvoie un résultat, il faut qu'une expression soit calculée, en d'autres termes, il faut qu'elle appelle une fonction, j'en suis arrivé à cette conclusion.

 
Vict:

Appeler une fonction dans laquelle vous passez un pointeur à une autre fonction (corps de boucle, par exemple)

J'ai étudié un pointeur de fonction, pour être honnête je n'ai jamais compris à quoi il sert, en fait au lieu d'une variable que l'on peut appeler une fonction peut me venir serré, un pointeur de fonction me rappelle une surcharge ou un polymorphisme.

 
Seric29:

J'ai étudié le pointeur de fonction, pour être honnête je n'ai pas compris à quoi il sert, en gros on peut appeler une fonction au lieu d'une variable peut-être que j'ai du mal, le pointeur de fonction est comme une surcharge ou un polymorphisme.

Vous disposez d'un algorithme à l'intérieur duquel vous pouvez placer un sous-algorithme, pour ainsi dire, afin de le "peaufiner" pour résoudre un problème particulier. Il s'agit essentiellement d'un analogue des fonctions virtuelles. L'essentiel est que vous l'ayez demandé vous-même, et maintenant vous ne savez pas pourquoi)), vous aviez un cadre, à l'intérieur duquel vous avez mis une boucle.

Raison: