ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 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

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

работает!

Спасибо!

 

Помогите решить такую задачу. Значит есть макрос и я хочу внутри него дописать код чтобы в конечном итоге вернуть результат.

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

Можно ли в указанноv месте дописать код так чтобы можно было вернуть результат из макроса? Код то дописать можно, пробовал но если написать return то эффект не ожидаемый. Я видел этот пример

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

здесь в теме там return работает.

 
Seric29:

Помогите решить такую задачу. Значит есть макрос и я хочу внутри него дописать код чтобы в конечном итоге вернуть результат.

Можно ли в указанноv месте дописать код так чтобы можно было вернуть результат из макроса? Код то дописать можно, пробовал но если написать return то эффект не ожидаемый. Я видел этот пример

здесь в теме там return работает.

Вызывайте функцию, в которую передаёте указатель на другую функцию (тело цикла, например)

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:

Вызывайте функцию, в которую передаёте указатель на другую функцию (тело цикла, например)

Я не знал что подобное можно делать, но моя задача это написать сложный многострочный макрос, в котором будет выполняться много команд, наверное макрос не может выполнять много команд и сделать из него функцию не получиться? Иногда есть нужда извлечь из функции например цикл, я думал возможно ли это может я пишу бред.

 
Seric29:

Я не знал что подобное можно делать, но моя задача это написать сложный многострочный макрос, в котором будет выполняться много команд, наверное макрос не может выполнять много команд и сделать из него функцию не получиться? Иногда есть нужда извлечь из функции например цикл, я думал возможно ли это может я пишу бред.

Не знаю что там за задача и туда ли копаете, но так навскидку - ещё один подход:

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

Так можете заменить любой кусок функции (необязательно заполнение массива как это у меня) и инстанцировать в нужном виде.

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

Я не знал что подобное можно делать, но моя задача это написать сложный многострочный макрос, в котором будет выполняться много команд, наверное макрос не может выполнять много команд и сделать из него функцию не получиться? Иногда есть нужда извлечь из функции например цикл, я думал возможно ли это может я пишу бред.

Можно, но не так.

 
Dmitry Fedoseev:

Можно, но не так.

Этот макрос будет void, для того чтобы вернуть из него результат нужно выражение которое будет рассчитано, другими словами нужно вызвать внутри него функцию, я пришёл к такому выводу.

 
Vict:

Вызывайте функцию, в которую передаёте указатель на другую функцию (тело цикла, например)

Я изучал указатель на функцию, если честно так и не понял зачем это, по сути вместо переменной можно вызвать функцию может до меня доходит туго, указатель на функцию напоминает перегрузку или полиморфизм.

 
Seric29:

Я изучал указатель на функцию, если честно так и не понял зачем это, по сути вместо переменной можно вызвать функцию может до меня доходит туго, указатель на функцию напоминает перегрузку или полиморфизм.

У вас есть некоторый алгоритм, внутрь которого можно всунуть подалгоритм, так сказать "заточить" под решение частной задачи. По сути - аналог виртуальных функций. Главное сами просили, а теперь не знаете зачем )), у вас ведь был каркас, внутрь которого подсовывали loop.