mql5中的OOP、模板和宏,细微之处和用途 - 页 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*/}

是否可以在给定的地方添加代码,以便我可以从宏中返回结果?你可以添加代码;我试过了,但如果你写的是返回,效果就不理想了。我看到这个例子

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

在这里,在返回工作的主题中。

 
Seric29:

帮助我解决这个问题。有一个宏,我想在里面添加代码以返回结果。

我可以在指定的地方添加代码来返回宏的结果吗?你可以添加代码;我试过了,但如果你写的是返回,效果就不理想了。我看到这个例子

在这里,在返回工作的主题中。

调用一个函数,在这个函数 中你传递一个指向另一个函数的指针(例如,循环体)。

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:

你可以,但不是像这样。

这个宏将是无效的,为了从它返回一个结果,你需要一个表达式来计算,换句话说,你需要在里面调用一个函数,我已经得出了这个结论。

 
Vict:

调用一个函数,在这个函数 中你传递一个指向另一个函数的指针(例如,循环体)。

我研究过一个函数指针,说实话,我一直不明白它是干什么用的,其实你可以调用一个函数而不是一个变量可能会让我觉得很紧张,一个函数指针类似于一个重载或多态。

 
Seric29:

我一直在研究函数指针,说实话,我还没有理解它的作用,基本上你可以调用一个函数而不是一个变量,也许我遇到了困难,函数指针就像一个重载或多态。

你有一些算法,你可以把一个子算法放在里面,可以说是 "调整 "它来解决一个特定的问题。从本质上讲,它是虚拟函数 的一个类似物。主要是你自己要求的,现在你不知道为什么)),你有一个框架,里面放了一个循环。

原因: