OOP, plantillas y macros en mql5, sutilezas y usos - página 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

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

¡funciona!

Gracias.

 

Ayúdame a resolver este problema. Hay una macro y quiero añadir código dentro de ella para devolver el resultado.

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

¿Es posible añadir código en el lugar indicado para que pueda devolver el resultado de la macro? Puedes añadir el código; lo he probado pero si escribes return, el efecto no es el esperado. He visto este ejemplo

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

aquí en el hilo donde funciona el retorno.

 
Seric29:

Ayúdame a resolver este problema. Hay una macro y quiero añadir código dentro de ella para devolver el resultado.

¿Es posible añadir código en el lugar indicado para que pueda devolver el resultado de la macro? Puedes añadir el código; lo he probado pero si escribes return, el efecto no es el esperado. He visto este ejemplo

aquí en el hilo donde funciona el retorno.

Llamar a una función en la que se pasa un puntero a otra función (cuerpo del bucle, por ejemplo)

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:

Llamar a una función en la que se pasa un puntero a otra función (el cuerpo de un bucle, por ejemplo)

No sabía que era posible hacer esto, pero mi objetivo es escribir una macro compleja de varias líneas que ejecute muchos comandos, probablemente una macro no puede ejecutar muchos comandos y hacerla una función no es posible? A veces es necesario extraer por ejemplo un bucle de una función, me preguntaba si es posible, tal vez estoy escribiendo tonterías.

 
Seric29:

No sabía que era posible hacer tal cosa, pero mi tarea es escribir una macro compleja de varias líneas, que ejecutará muchos comandos, probablemente una macro no puede ejecutar muchos comandos y hacer una función de ella es imposible? A veces hay necesidad de hacer un bucle de una función, me pregunto si es posible, tal vez estoy escribiendo tonterías.

No sé cuál es la tarea y si usted está cavando allí, pero de un vistazo - otro enfoque:

#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 esta manera puedes reemplazar cualquier pieza de la función (no necesariamente el llenado de arrays como es en mi caso) e instanciarla según sea necesario.

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

No sabía que era posible hacer tal cosa, pero mi tarea es escribir una macro compleja de varias líneas, que ejecutará muchos comandos, probablemente una macro no puede ejecutar muchos comandos y hacer una función de ella es imposible? A veces puedo necesitar hacer un bucle de una función, me pregunto si es posible, tal vez estoy escribiendo tonterías.

Es posible, pero no así.

 
Dmitry Fedoseev:

Puedes, pero no así.

Esta macro será nula, para devolver un resultado de la misma se necesita que se calcule una expresión, es decir, que se llame a una función dentro de ella, he llegado a esta conclusión.

 
Vict:

Llamar a una función en la que se pasa un puntero a otra función (cuerpo del bucle, por ejemplo)

Estudié un puntero de función, para ser sincero nunca entendí para qué sirve, de hecho en lugar de una variable se puede llamar a una función me puede venir bien, un puntero de función me recuerda a una sobrecarga o polimorfismo.

 
Seric29:

He estado estudiando el puntero de función, para ser sincero no he entendido para que sirve, básicamente puedes llamar a una función en vez de a una variable quizás me esté costando, el puntero de función es como una sobrecarga o polimorfismo.

Tienes un algoritmo dentro del cual puedes poner un subalgoritmo, por así decirlo, para "retocarlo" y resolver un problema concreto. En esencia, es un análogo de las funciones virtuales. Lo principal es que tú mismo lo pediste, y ahora no sabes por qué)), tenías un marco, dentro del cual pusiste un bucle.