Как последовательно перебрать перечисление? - страница 5

 
Sergei Vladimirov:
 С чего вдруг?
TickSize на MIX равен 25, Digits - 0. Нормализация целочисленный цены, не кратной 25, вызовет ошибку OrderSend.
 
fxsaber:
TickSize на MIX равен 25, Digits - 0. Нормализация целочисленный цены, не кратной 25, вызовет ошибку OrderSend.
Как раз только что в соседней ветке советовал утопить комп в ванне, тогда все будет дискредитировано еще сильнее.
 
Dmitry Fedoseev:
Как раз только что в соседней ветке советовал утопить комп в ванне, тогда все будет дискредитировано еще сильнее.
Вы балабол, к сожалению. Ничего не создаю, но охаить имею право - про вас.
 
fxsaber:
TickSize на MIX равен 25, Digits - 0. Нормализация целочисленный цены, не кратной 25, вызовет ошибку OrderSend.
Ну, с такой логикой и в случае шага 0.25 нормализация выдавала бы ошибку. Задача нормализации не в том, чтобы подогнать цену до какого-то экзотического шага цены, а в округлении числа с плавающей точкой до заданной точности. Ни к каким ошибкам это не приводит.
 
Sergei Vladimirov:
Ну, с такой логикой и в случае шага 0.25 нормализация выдавала бы ошибку. Задача нормализации не в том, чтобы подогнать цену до какого-то экзотического шага цены, а в округлении числа с плавающей точкой до заданной точности. Ни к каким ошибкам это не приводит.
Нормализация изначально вводилась только для одного (и это в справке упоминается) - для торговых функций. 
 
Vladimir Batrudinov:

Наверно нужно ввести две функции: 1 - возвращает количество элементов в перечислении, 2 - возвращает элемент по номеру...


В enum можно присваивать элементам любые значения, например, как ниже. enum - это не массив.

enum crazy
{
    e1 = 100500,
    e2 = -200,
    e3 = -100500,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
    int z10 = e2;
    int z1 = e4;
  
}

 Языки типа C# требуют указания имени enum, а С++ и следовательно MQL4/5 довольно вольно обращаются с enum. На всякий случай проверил, на MQL5 этот бред компилируется, как и на С++

 
Alexey Volchanskiy:

В enum можно присваивать элементам любые значения, например, как ниже. enum - это не массив.

И что с того?  Речь шла о том, чтобы перебрать эти элементы в порядке объявления.
 
Alexey Navoykov:
И что с того?  Речь шла о том, чтобы перебрать эти элементы в порядке объявления.
А, ну да, я неправильно прочитал вопрос, подумал, по значениям.
 

На заметку программистам:

#define ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3)   \
  ENUM_QQ_HELPER(el_2, 9)   \
  ENUM_QQ_HELPER(el_3, 38)  \
  ENUM_QQ_HELPER(el_4, 1)   

enum Enum_qq
{
#define ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef ENUM_QQ_HELPER
};

void get_enumqq_array(int &ar[])
{
  int temp[] = {
#define ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef ENUM_QQ_HELPER
  };
  ArrayResize(ar, ArraySize(temp));
  for(int i = 0;  i < ArraySize(temp);  ++i)
    ar[i] = temp[i];
}

void OnStart()
{
  int q[];
  get_enumqq_array(q);
  for(int i = 0;  i < ArraySize(q);  ++i)
    Alert(q[i]);
}


Теперь если нам надо редактировать перечисление, то мы редактируем один раз и в одном месте. Надо добавить новый элемент, например element_new = 56, добавляем

ENUM_QQ_HELPER(element_new , 56)

И не паримся о правки функции get_enumqq_array(). Техника называется X Macro https://en.wikipedia.org/wiki/X_Macro. При желании разработчиков, легко можно допилить стандартные перечисления подобным образом.

Может не очевидно сразу, перечисление получилось таким:

enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1   
};
 
Vasiliy Sokolov:

Допустим, имеем перечисление. Как последовательно, например в цикле, получить все возможные значения этого перечисления?

Т.е. tf1++ должно последовательно возвращать PERIOD_M1, PERIOD_M2, PERIOD_M5... Думаю, что средствами языка это сделать нельзя.

не испробовано, но по идее если есть ENUM_MYENUM то (ENUM_MYENUM)INT_MAX должен давать максимальное значение из энума. Иначе это БАГ приведения типов. Просто из соображений что оператор приведения к типу (type) обязан возвращать значение этого самого типа.. Не обязательно валидное в контексте, но допустимое для типа.
Причина обращения: