Как увеличить переданное перечисление в функции? - PullRequest
1 голос
/ 07 ноября 2019

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

Вот мой соответствующий код:

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

Как я могу использовать переданное перечисление для доступа к следующему или предыдущему, каквпервые определено?

1 Ответ

2 голосов
/ 08 ноября 2019

FACT: MQL4 не является скомпилированным C-lang

Данные типа enum принадлежат некоторому ограниченному набору данных. Определение типа перечисления:

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 -ы перестали бытьstring -s и внезапно, без предварительного или последующего уведомления, они молча становятся struct -s - each Управляющий фондом, трейдер, член группы поддержки или специалист по поддержке API могут представить себе шок и кошмар, когда все обернется хаосом, не имея возможности понять, почему (уведомление string -> struct было, но в следующем выпускеФайл справки для MQL4 / MetaEditor ... слишком много волос ушло, бесчисленное количество средств испарилось до тех пор, пока основная причина разбитых фабрик не была обнаружена скрытой в тангенциальном уведомлении в файле справки, и "изменение" было пересмотреновернемся к перепроектированию API ... Лучше не подвергать себя подобному неуправляемому риску или скорее не дурачиться с подобными "зависимостями" на территории движущихся песков)

По крайней мере, вы были предупреждены : o)

Примечания:

  • В отличие от C ++,размер внутреннего представления перечислимого типа в MQL4 всегда равен 4 байта. То есть sizeof( months ) возвращает значение 4.
  • В отличие от C ++, анонимное перечисление не может быть объявлено в MQL4. То есть уникальное имя всегда должно указываться после ключевого слова enum.
...