OOP, modelli e macro in mql5, sottigliezze e usi - pagina 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

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

funziona!

Grazie!

 

Aiutami a risolvere questo problema. C'è una macro e voglio aggiungere del codice al suo interno per restituire il risultato.

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

È possibile aggiungere del codice nel posto indicato in modo da poter restituire il risultato della macro? Puoi aggiungere il codice; ho provato, ma se scrivi return, l'effetto non è previsto. Ho visto questo esempio

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

qui nel thread dove il ritorno funziona.

 
Seric29:

Aiutami a risolvere questo problema. C'è una macro e voglio aggiungere del codice al suo interno per restituire il risultato.

È possibile aggiungere del codice nel posto indicato in modo da poter restituire il risultato della macro? Puoi aggiungere il codice; ho provato, ma se scrivi return, l'effetto non è previsto. Ho visto questo esempio

qui nel thread dove il ritorno funziona.

Chiamare una funzione in cui si passa un puntatore a un'altra funzione (corpo del ciclo, per esempio)

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:

Chiamare una funzione in cui si passa un puntatore a un'altra funzione (il corpo di un ciclo, per esempio)

Non sapevo che fosse possibile farlo, ma il mio obiettivo è scrivere una complessa macro multilinea che eseguirà molti comandi, probabilmente una macro non può eseguire molti comandi e renderla una funzione non è possibile? A volte c'è la necessità di estrarre per esempio un ciclo da una funzione, mi chiedevo se è possibile, forse sto scrivendo cose senza senso.

 
Seric29:

Non sapevo che fosse possibile fare una cosa del genere, ma il mio compito è scrivere una complessa macro multilinea, che eseguirà molti comandi, probabilmente una macro non può eseguire molti comandi e farne una funzione è impossibile? A volte c'è la necessità di fare un ciclo da una funzione, mi chiedo se è possibile, forse sto scrivendo cose senza senso.

Non so quale sia il compito e se si sta scavando lì, ma a colpo d'occhio - un altro approccio:

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

In questo modo si può sostituire qualsiasi pezzo di funzione (non necessariamente il riempimento dell'array come nel mio caso) e istanziarlo come necessario.

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

Non sapevo che fosse possibile fare una cosa del genere, ma il mio compito è scrivere una complessa macro multilinea, che eseguirà molti comandi, probabilmente una macro non può eseguire molti comandi e farne una funzione è impossibile? A volte ho bisogno di fare un ciclo da una funzione, mi chiedo se è possibile, forse sto scrivendo cose senza senso.

È possibile, ma non così.

 
Dmitry Fedoseev:

Si può, ma non così.

Questa macro sarà nulla, per restituire un risultato da essa avete bisogno di un'espressione da calcolare, in altre parole dovete chiamare una funzione al suo interno, sono arrivato a questa conclusione.

 
Vict:

Chiamare una funzione in cui si passa un puntatore a un'altra funzione (corpo del ciclo, per esempio)

Ho studiato un puntatore a funzione, ad essere onesti non ho mai capito a cosa serve, infatti invece di una variabile si può chiamare una funzione può venirmi stretto, un puntatore a funzione mi ricorda un overload o un polimorfismo.

 
Seric29:

Ho studiato il puntatore di funzione, ad essere sincero non ho capito a cosa serve, in pratica puoi chiamare una funzione al posto di una variabile forse sto facendo fatica, il puntatore di funzione è come un overload o polimorfismo.

Avete un qualche algoritmo all'interno del quale potete mettere un sub-algoritmo, per così dire, per "metterlo a punto" per risolvere un problema particolare. In sostanza, è un analogo delle funzioni virtuali. La cosa principale è che l'hai chiesto tu stesso, e ora non sai perché)), avevi una struttura, dentro la quale hai messo un ciclo.