我怎样才能持续地通过列举? - 页 2 12345678 新评论 Sergey Gritsay 2010.08.06 00:23 #11 而多花点心思,你可以得到这样的函数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); } Mykola Demko 2010.08.06 01:59 #12 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 Ilyas 2010.08.06 11:11 #13 关于枚举,有一个讨论。 1) 为枚举引入++。 2) 枚举值向字符串的转换 ENUM_TIMEFRAMES t=PERIOD_M1; string s=(string)t; s будет иметь значение "PERIOD_M1" Vasiliy Sokolov 2010.08.07 21:01 #14 mql5: 关于枚举,有一个讨论。 1) 为枚举引入++。 2) 枚举值向字符串的转换 强烈支持。特别是第一点。仅仅在标准包中就有数百个枚举,为每个枚举单独编写一个函数的成本太高了。 --- 2016.08.20 13:31 #15 Ilyas: 关于转让,有一个讨论。 1) 为枚举引入++。这种功能是否已经存在?或者用另一种方法按顺序列出项目? Denis Kirichenko 2016.08.20 15:45 #16 给我们迭代器! Georgiy Merts 2016.08.20 17:40 #17 在我看来,对于一个枚举来说,递增并不是正确的步骤。 默认的枚举不一定要有顺序,此外,在开发过程中--可以在 "中间 "向其添加值。 当然,为了 "简化",通过递增枚举来获得即时的 "下一个 "值也不错,但在我看来,这是一种潜在的危险做法。 为了获得枚举中的 "下一个值",最合理的做法是使用特殊函数,这里已经提到。 而人们似乎忽视了默认的选择器,而且是徒劳的。每个switch()都必须包含这个选择器,并警告说有一个不明显的值已经到来。 --- 2016.08.20 17:52 #18 George Merts:通过递增枚举 - 立即获得 "下一个 "值 这就是伊利亚斯 的意思。我有一个问题要问他或负责的开发商。这个问题是否已经解决了--以某种方式通过所有的元素进行编程,还是仍在进行中...我并不关心如何通过foreach操作者新函数,如GetNextEnum / GetLastEnum / GetFirstEnum或过载 ++只要不是像上面建议的那样--为目前的面额画出函数,然后担心开发人员更新时不会有什么问题。 Alexey Navoykov 2016.08.20 19:43 #19 天啊,为什么这么复杂--一些加法器、迭代器......最明显和灵活的解决方案是在语言中引入一个函数,将所有枚举值 放入一个数组中。 然后你决定如何遍历这个数组,甚至横向遍历。此外,无论如何你都要保存所有的值,因为你不会在每次调用时都重新刷新所有的值。 一旦你绕过了它,存储了它,然后你就从数组中取走它。 那么,一次性得到一个准备好的数组不是更容易吗?顺便说一下,带有运算符重载++的变体可能会导致现有程序的不正确工作,所以这是一个非常糟糕的方法。 那么,这里显示的例子(案例1:返回值1;案例2:返回值2;案例3:返回值3......一个适当的人将把所有的值放入一个数组中,并通过其索引获得所需的值,而对于反向任务,他/她将使用二进制搜索。 TheXpert 2016.08.20 21:59 #20 Alexey Navoykov:天啊,所有这些复杂的东西有什么意义--加法、迭法......。我不在乎你希望它是怎样的。 那么,这里显示的例子(案例1:返回值1;案例2:返回值2;案例3:返回值3......一个足够的人将把所有的值放入一个数组中,并通过其索引获得所需的值即可,而二进制搜索将被用于反向任务。 开关是一个非常有效的东西 12345678 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
而多花点心思,你可以得到这样的函数
而如果你再绞尽脑汁,你可以得到以下功能
为什么?
由于该函数是int,所以让return也来做这个动作。
而调用的方式可能是这样的
结果是
1) 为枚举引入++。
2) 枚举值向字符串的转换
关于枚举,有一个讨论。
1) 为枚举引入++。
2) 枚举值向字符串的转换
关于转让,有一个讨论。
1) 为枚举引入++。
这种功能是否已经存在?
或者用另一种方法按顺序列出项目?
在我看来,对于一个枚举来说,递增并不是正确的步骤。
默认的枚举不一定要有顺序,此外,在开发过程中--可以在 "中间 "向其添加值。
当然,为了 "简化",通过递增枚举来获得即时的 "下一个 "值也不错,但在我看来,这是一种潜在的危险做法。
为了获得枚举中的 "下一个值",最合理的做法是使用特殊函数,这里已经提到。
而人们似乎忽视了默认的选择器,而且是徒劳的。每个switch()都必须包含这个选择器,并警告说有一个不明显的值已经到来。
George Merts:
通过递增枚举 - 立即获得 "下一个 "值
这就是伊利亚斯 的意思。
我有一个问题要问他或负责的开发商。这个问题是否已经解决了--以某种方式通过所有的元素进行编程,还是仍在进行中...
我并不关心如何通过
foreach操作者
新函数,如GetNextEnum / GetLastEnum / GetFirstEnum
或过载 ++
只要不是像上面建议的那样--为目前的面额画出函数,然后担心开发人员更新时不会有什么问题。
天啊,为什么这么复杂--一些加法器、迭代器......最明显和灵活的解决方案是在语言中引入一个函数,将所有枚举值 放入一个数组中。 然后你决定如何遍历这个数组,甚至横向遍历。此外,无论如何你都要保存所有的值,因为你不会在每次调用时都重新刷新所有的值。 一旦你绕过了它,存储了它,然后你就从数组中取走它。 那么,一次性得到一个准备好的数组不是更容易吗?
顺便说一下,带有运算符重载++的变体可能会导致现有程序的不正确工作,所以这是一个非常糟糕的方法。
那么,这里显示的例子(案例1:返回值1;案例2:返回值2;案例3:返回值3......一个适当的人将把所有的值放入一个数组中,并通过其索引获得所需的值,而对于反向任务,他/她将使用二进制搜索。
天啊,所有这些复杂的东西有什么意义--加法、迭法......。
我不在乎你希望它是怎样的。
那么,这里显示的例子(案例1:返回值1;案例2:返回值2;案例3:返回值3......一个足够的人将把所有的值放入一个数组中,并通过其索引获得所需的值即可,而二进制搜索将被用于反向任务。