首页 > 解决方案 > 如何在函数中增加传递的枚举?

问题描述

我正在将枚举传递给函数。在这个函数中,我想用一些整数步长增加传递的枚举。我认为这是可能的,因为根据定义,枚举应该是一个整数。但由于某种原因,以下不起作用。

这是我的相关代码:

enum THE_ENUM {
    S3,
    S4,
    S5,
    ...
};

double getPrice(THE_ENUM level) {
    switch (level) {
        case S3 : return mml[S3];
        case S4 : return mml[S4];
        case S5 : return mml[S5];
        ...
    }
    ...
}

int placeOrder(THE_ENUM tPL) {
    ...
    price = getPrice(S4);     // this works
    price = getPrice(tPL);    // this works
    price = getPrice(tPL+2);  // this doesn't!
    ...
}
...
placeOrder(S3);
...

如何使用传递的枚举来访问第一个定义的下一个或上一个枚举?

标签: enumsmql4

解决方案


事实:MQL4不是编译的 C-lang

枚举类型的数据属于某个有限的数据集。定义枚举类型:

enum name of enumerable type
{
list of values
};

值列表是由逗号分隔的命名常量的标识符列表。声明枚举后,会出现一个新的整数值 4 字节数据类型。新数据类型的声明允许编译器严格控制传递参数的类型,因为枚举引入了新的命名常量。在上面的例子中,一月命名常量的值是 0,二月 - 1,十二月 - 11。

规则:如果某个值没有分配给作为枚举成员的命名常量,则将形成它的新值自动地。如果它是枚举的第一个成员,则会为其分配 0 值。对于所有后续成员,将根据之前成员的值加一来计算值。

例子:

enum intervals      // Enumeration of named constants
   {
    month      =  1, // Interval of one month       ---- code-assogned =  1
    two_months,      // Two months                  ---- auto-assigned  ~ 2
    quarter,         // Three months - a quarter    ---- auto-assigned  ~ 3
    halfyear   =  6, // Half a year                 ---- CODE-assigned =  6
    year       = 12, // Year - 12 months            ---- CODE-assigned = 12
    wild13,          //        13 months            ---- auto-assigned  ~13
    decade     =120  // Decade                      ---- CODE-assigned =120
   };

这意味着,希望拥有的、编译器辅助的 -enum值“算术”(要求有机会调用getPrice(second-value-before-wild13 ”中的动态评估/解码)是可能的,但是不要期望 MQL4 语言架构师可以将它作为一个包含电池的、唾手可得的果实,他们已经优化了编译语言代码以提高效率和最小延迟。

一个人可以实现自己的MQL4-enum-s 算法,正如上面的价格级别double getPrice( smart_ENUM aLevelCONST )映射器努力实现的那样,但是使用超出其限制的受限语言开发这种设计的成本是由自己考虑的(不要忘记几年令人惊讶的是,当string-s 不再是string-s 并且突然间,没有事先或事后通知,它们默默地变成了struct-s - 每个基金经理、交易员、支持团队成员或 API 维护者都可以想象这种震惊和噩梦,一旦事情变得严重破坏而没有机会理解为什么(string- >struct通知是,但在 MQL4/MetaEditor 的下一个版本的帮助文件中......太多的头发掉了,无数的资金蒸发,直到发现工厂崩溃的根本原因隐藏在帮助文件的一个切线通知中并且“变化”被重新考虑到 API 重新设计中……我们最好不要将自己暴露在类似的无法管理的风险中,或者不要在移动的沙滩上玩弄类似的“依赖” )

至少,你已经被警告了:o)

备注:

  • 与 C++ 不同,MQL4 中枚举类型的内部表示的大小始终等于 4 个字节。也就是说,sizeof( months )返回值 4。
  • 与 C++ 不同,不能在 MQL4 中声明匿名枚举。也就是说,必须始终在enum关键字之后指定唯一名称。

推荐阅读