OOP, modelos e macros em mql5, sutilezas e 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!

Obrigado!

 

Ajude-me a resolver este problema. Há uma macro e eu quero adicionar código dentro dela para retornar o 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*/}

É possível acrescentar código no local determinado para que eu possa retornar o resultado da macro? Você pode adicionar o código; eu tentei, mas se você escrever retorno, o efeito não é esperado. Eu vi este exemplo

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

aqui na linha onde funciona o retorno.

 
Seric29:

Ajude-me a resolver este problema. Há uma macro e eu quero adicionar código dentro dela para retornar o resultado.

É possível acrescentar código no local determinado para que eu possa retornar o resultado da macro? Você pode adicionar o código; eu tentei, mas se você escrever retorno, o efeito não é esperado. Eu vi este exemplo

aqui na linha onde funciona o retorno.

Chamar uma função na qual você passa um ponteiro para outra função (corpo de laço, por exemplo)

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:

Chamar uma função na qual você passa um ponteiro para outra função (o corpo de um laço, por exemplo)

Eu não sabia que era possível fazer isso, mas meu objetivo é escrever uma macro complexa de várias linhas que executará muitos comandos, provavelmente uma macro não pode executar muitos comandos e torná-la uma função não é possível... Às vezes há a necessidade de extrair, por exemplo, um loop de uma função, eu estava me perguntando se isso é possível, talvez eu esteja escrevendo bobagens.

 
Seric29:

Eu não sabia que era possível fazer tal coisa, mas minha tarefa é escrever uma macro complexa de várias linhas, que executará muitos comandos, provavelmente uma macro não pode executar muitos comandos e fazer uma função a partir dela é impossível... Às vezes há a necessidade de fazer um loop fora de uma função, eu me perguntava se isso é possível, talvez eu esteja escrevendo bobagens.

Eu não sei qual é a tarefa e se você está cavando lá, mas num relance - outra abordagem:

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

Desta forma, você pode substituir qualquer peça de função (não necessariamente preenchimento de matriz como é no meu caso) e instanciá-la conforme necessário.

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

Eu não sabia que era possível fazer tal coisa, mas minha tarefa é escrever uma macro complexa de várias linhas, que executará muitos comandos, provavelmente uma macro não pode executar muitos comandos e fazer uma função a partir dela é impossível... Às vezes eu talvez precise fazer um loop fora de uma função, eu me pergunto se é possível, talvez eu esteja escrevendo bobagens.

É possível, mas não desta forma.

 
Dmitry Fedoseev:

Você pode, mas não desta forma.

Esta macro será nula, para retornar um resultado dela você precisa de uma expressão para ser calculada, em outras palavras, você precisa chamar uma função dentro dela, cheguei a esta conclusão.

 
Vict:

Chamar uma função na qual você passa um ponteiro para outra função (corpo de laço, por exemplo)

Eu estudei um ponteiro de função, para ser honesto, nunca entendi para que serve, de fato você pode chamar uma função em vez de uma variável pode vir até mim firmemente, um ponteiro de função se assemelha a uma sobrecarga ou polimorfismo.

 
Seric29:

Estive estudando o ponteiro de função, para ser honesto, não entendi para que serve, basicamente você pode chamar uma função em vez de uma variável talvez eu esteja passando por um momento difícil, o ponteiro de função é como uma sobrecarga ou polimorfismo.

Você tem algum algoritmo dentro do qual pode colocar um subalgoritmo, por assim dizer, para "ajustá-lo" para resolver um problema em particular. Em essência, é um análogo de funções virtuais. O principal é que você mesmo o pediu, e agora você não sabe por que)), você tinha uma estrutura, dentro da qual você colocou um laço.