我怎样才能持续地通过列举? - 页 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) 为枚举引入++。


这种功能是否已经存在?

或者用另一种方法按顺序列出项目?

 
给我们迭代器!
 

在我看来,对于一个枚举来说,递增并不是正确的步骤。

默认的枚举不一定要有顺序,此外,在开发过程中--可以在 "中间 "向其添加值。

当然,为了 "简化",通过递增枚举来获得即时的 "下一个 "值也不错,但在我看来,这是一种潜在的危险做法。

为了获得枚举中的 "下一个值",最合理的做法是使用特殊函数,这里已经提到。

而人们似乎忽视了默认的选择器,而且是徒劳的。每个switch()都必须包含这个选择器,并警告说有一个不明显的值已经到来。

 

George Merts:

通过递增枚举 - 立即获得 "下一个 "值

这就是伊利亚斯 的意思。

我有一个问题要问他或负责的开发商。这个问题是否已经解决了--以某种方式通过所有的元素进行编程,还是仍在进行中...

我并不关心如何通过

foreach操作者

新函数,如GetNextEnum / GetLastEnum / GetFirstEnum

或过载 ++

只要不是像上面建议的那样--为目前的面额画出函数,然后担心开发人员更新时不会有什么问题。

 

天啊,为什么这么复杂--一些加法器、迭代器......最明显和灵活的解决方案是在语言中引入一个函数,将所有枚举值 放入一个数组中。 然后你决定如何遍历这个数组,甚至横向遍历。此外,无论如何你都要保存所有的值,因为你不会在每次调用时都重新刷新所有的值。 一旦你绕过了它,存储了它,然后你就从数组中取走它。 那么,一次性得到一个准备好的数组不是更容易吗?

顺便说一下,带有运算符重载++的变体可能会导致现有程序的不正确工作,所以这是一个非常糟糕的方法。

那么,这里显示的例子(案例1:返回值1;案例2:返回值2;案例3:返回值3......一个适当的人将把所有的值放入一个数组中,并通过其索引获得所需的值,而对于反向任务,他/她将使用二进制搜索

 
Alexey Navoykov:

天啊,所有这些复杂的东西有什么意义--加法、迭法......。

我不在乎你希望它是怎样的。

那么,这里显示的例子(案例1:返回值1;案例2:返回值2;案例3:返回值3......一个足够的人将把所有的值放入一个数组中,并通过其索引获得所需的值即可,而二进制搜索将被用于反向任务。

开关是一个非常有效的东西