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

 

А если поднапрячь еще немного мозги можно получить такую функцию

int GetPeriodEnumerator(
uchar i,              // индекс перечисления 
ENUM_TIMEFRAMES &tf,  // сюда принимаем числовое значение таймфрейма 
string &tfs           // сюда принимаем строковое значение таймфрейма
)
  {
   switch(i)
     {
      case 0:  {tf=PERIOD_M1;tfs="M1";return(0);}
      case 1:  {tf=PERIOD_M2;tfs="M2";return(0);}
      case 2:  {tf=PERIOD_M3;tfs="M3";return(0);}
      case 3:  {tf=PERIOD_M4;tfs="M4";return(0);}
      case 4:  {tf=PERIOD_M5;tfs="M5";return(0);}
      case 5:  {tf=PERIOD_M6;tfs="M6";return(0);}
      case 6:  {tf=PERIOD_M10;tfs="M10";return(0);}
      case 7:  {tf=PERIOD_M12;tfs="M12";return(0);}
      case 8:  {tf=PERIOD_M15;tfs="M15";return(0);}
      case 9:  {tf=PERIOD_M20;tfs="M20";return(0);}
      case 10: {tf=PERIOD_M30;tfs="M30";return(0);}
      case 11: {tf=PERIOD_H1;tfs="H1";return(0);}
      case 12: {tf=PERIOD_H2;tfs="H2";return(0);}
      case 13: {tf=PERIOD_H3;tfs="H3";return(0);}
      case 14: {tf=PERIOD_H4;tfs="H4";return(0);}
      case 15: {tf=PERIOD_H6;tfs="H6";return(0);}
      case 16: {tf=PERIOD_H8;tfs="H8";return(0);}
      case 17: {tf=PERIOD_H12;tfs="H12";return(0);}
      case 18: {tf=PERIOD_D1;tfs="D1";return(0);}
      case 19: {tf=PERIOD_W1;tfs="W1";return(0);}
      case 20: {tf=PERIOD_MN1;tfs="MN1";return(0);}
     }
   return(-1);
  }
 
sergey1294:

А если поднапрячь еще немного мозги можно получить такую функцию

Отчего ж

return(0)

раз функция int то пущай и return пользу приностит.

int GetPeriodEnumerator(
uchar i,              // индекс перечисления 
ENUM_TIMEFRAMES &tf,  // сюда принимаем числовое значение таймфрейма 
string &tfs           // сюда принимаем строковое значение таймфрейма
)
  {
   switch(i)
     {
      case 0:  {tf=PERIOD_M1;tfs="M1";return(PeriodSeconds(tf)/60);}
      case 1:  {tf=PERIOD_M2;tfs="M2";return(PeriodSeconds(tf)/60);}
      case 2:  {tf=PERIOD_M3;tfs="M3";return(PeriodSeconds(tf)/60);}
      case 3:  {tf=PERIOD_M4;tfs="M4";return(PeriodSeconds(tf)/60);}
      case 4:  {tf=PERIOD_M5;tfs="M5";return(PeriodSeconds(tf)/60);}
      case 5:  {tf=PERIOD_M6;tfs="M6";return(PeriodSeconds(tf)/60);}
      case 6:  {tf=PERIOD_M10;tfs="M10";return(PeriodSeconds(tf)/60);}
      case 7:  {tf=PERIOD_M12;tfs="M12";return(PeriodSeconds(tf)/60);}
      case 8:  {tf=PERIOD_M15;tfs="M15";return(PeriodSeconds(tf)/60);}
      case 9:  {tf=PERIOD_M20;tfs="M20";return(PeriodSeconds(tf)/60);}
      case 10: {tf=PERIOD_M30;tfs="M30";return(PeriodSeconds(tf)/60);}
      case 11: {tf=PERIOD_H1;tfs="H1";return(PeriodSeconds(tf)/60);}
      case 12: {tf=PERIOD_H2;tfs="H2";return(PeriodSeconds(tf)/60);}
      case 13: {tf=PERIOD_H3;tfs="H3";return(PeriodSeconds(tf)/60);}
      case 14: {tf=PERIOD_H4;tfs="H4";return(PeriodSeconds(tf)/60);}
      case 15: {tf=PERIOD_H6;tfs="H6";return(PeriodSeconds(tf)/60);}
      case 16: {tf=PERIOD_H8;tfs="H8";return(PeriodSeconds(tf)/60);}
      case 17: {tf=PERIOD_H12;tfs="H12";return(PeriodSeconds(tf)/60);}
      case 18: {tf=PERIOD_D1;tfs="D1";return(PeriodSeconds(tf)/60);}
      case 19: {tf=PERIOD_W1;tfs="W1";return(PeriodSeconds(tf)/60);}
      case 20: {tf=PERIOD_MN1;tfs="MN1";return(PeriodSeconds(tf)/60);}
     }
   return(-1);
  }

ну и вызов видимо вот так

   ENUM_TIMEFRAMES tf;
   string tfs;
   Print(" мин=",GetPeriodEnumerator(11,tf,tfs),"  ENUM=",tf,"  string=",tfs);

результат такой

 

 мин=60  ENUM=16385  string=H1
 
По перечислениям обсуждается:
  1) введение ++ для перечисления
  2) преобразование перечисления к строке
ENUM_TIMEFRAMES t=PERIOD_M1;
string s=(string)t;

s будет иметь значение "PERIOD_M1"
 
mql5:
По перечислениям обсуждается:
  1) введение ++ для перечисления
  2) преобразование перечисления к строке

Горячо поддерживаю. Особенно первый пункт. Только в стандартной поставки сотни перечислений, и писать для каждого перечисления отдельную функцию слишком затратно.
 
Ilyas:
По перечислениям обсуждается:
  1) введение ++ для перечисления


Есть ли уже такой функционал?

Или другая альтернатива чтоб последовательно перебрать элементы перечисления??

 
Даёшь итераторы!
 

Мне кажется, что инкрементация для перечисления - это не совсем верный шаг.

Перечисление по умолчанию - вовсе не обязательно должно быть последовательным, а кроме того, при разработке - в него "в середину" могут добавляться значения.

Понятное дело, что "для упрощения" было бы неплохо инкрементируя перечисления - получать сразу же "следующее" значение, но, по-моему, это потенциально опасная практика.

Для получения "следующего значения" в перечислении самое разумное - это использовать специальную функцию, как тут уже и говорилось.

Причем, как я погляжу, народ игнорирует селектор default - и очень напрасно. В каждом switch() - обязательно должен быть этот селектор с предупреждением, что пришло непонятное значение.

 

George Merts:

инкрементируя перечисления - получать сразу же "следующее" значение

Ilyas это и имел ввиду

У меня к нему или ответственному разработчику вопрос был. Решилась эта задача - каким то образом перебрать программно все элементы или все еще в процессе...

Мне особо все равно как проходить

оператор foreach

новые функции типа GetNextEnum / GetLastEnum / GetFirstEnum

или перегрузка ++

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

 

Боже, да зачем такие сложности - какие-то плюсики, итераторы...  Cамое очевидное и гибкое решение - это ввести в язык функцию, получающую все значения перечисления в массив.  И дальше уже сам решаешь, как обходить этот массив, хоть крест-накрест.   Тем более, тебе ведь в любом случае придётся сохранять все значения.  Не собираешься же ты на каждом вызове повторно всё обходить.  Один раз обошёл, сохранил, и дальше просто берёшь из массива.  Так не проще ли сразу получить готовый массив?

Кстати, а вариант с перегрузкой оператора ++ может привести к некорректной работе уже существующих программ, так что это крайне плохой вариант.

Ну а продемонстрированные тут примеры (case 1: return value1;  case 2: return value2;  case 3: return value3... и т.д.) - это вообще образец глупости.  Адекватный человек поместит все значения в массив и будет просто получать нужное значение по его индексу.  А для обратной задачи воспользуется бинарным поиском.

 
Alexey Navoykov:

Боже, да зачем такие сложности - какие-то плюсики, итераторы...  

Да хоть как, лишь бы было.

Ну а продемонстрированные тут примеры (case 1: return value1;  case 2: return value2;  case 3: return value3... и т.д.) - это вообще образец глупости.  Адекватный человек поместит все значения в массив и будет просто получать нужное значение по его индексу.  А для обратной задачи воспользуется бинарным поиском.

switch очень эффективная штука