Sıralı olarak bir numaralandırma üzerinde yineleme nasıl yapılır? - sayfa 2

 

Ve beyninizi biraz daha zorlarsanız böyle bir işlev elde edebilirsiniz.

 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 :

Ve beyninizi biraz daha zorlarsanız böyle bir işlev elde edebilirsiniz.

Niye ya

 return ( 0 )

int işlevi bir kez, bırak gitsin ve geri dönüş faydalar sağlar.

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

peki, meydan okuma şuna benziyor

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

sonuç

 мин= 60   ENUM= 16385    string =H1
 
Listeler tartışılıyor:
1) enum için giriş ++
2) enum'u dizgeye dönüştür
 ENUM_TIMEFRAMES t=PERIOD_M1;
string s=(string)t;

s будет иметь значение " PERIOD_M1 "
 
mql5 :
Listeler tartışılıyor:
1) enum için giriş ++
2) enum'u dizgeye dönüştür

canı gönülden destekliyorum Özellikle ilk nokta. Yalnızca standart dağıtımda yüzlerce numaralandırma vardır ve her numaralandırma için ayrı bir işlev yazmak çok pahalıdır.
 
Ilyas :
Listeler tartışılıyor:
1) enum için giriş ++


Bu işlev zaten var mı?

Veya enum öğelerini sırayla yinelemek için başka bir alternatif ??

 
Yineleyiciler veriyorsun!
 

Bana öyle geliyor ki bir numaralandırma için artış yapmak pek doğru bir hareket değil.

Varsayılan numaralandırmanın hiç sıralı olması gerekmez ve ayrıca geliştirme sırasında “ortada” değerler eklenebilir.

"Basitleştirmek" için, numaralandırmaları artırmanın - "sonraki" değeri hemen almanın güzel olacağı açıktır, ancak bence bu, potansiyel olarak tehlikeli bir uygulamadır.

Enumdaki "sonraki değeri" elde etmek için yapılacak en mantıklı şey, burada daha önce bahsedildiği gibi özel bir işlev kullanmaktır.

Üstelik, gördüğüm kadarıyla, insanlar varsayılan seçiciyi görmezden geliyor - ve çok boşuna. Her anahtarda() - anlaşılmaz bir değerin geldiğine dair bir uyarı içeren bu seçici olmalıdır.

 

George Merts :

artan numaralandırmalar - "sonraki" değeri hemen alın

İlyas bunu demek istedi

Ona veya sorumlu geliştiriciye bir sorum vardı. Bu görev çözüldü - bir şekilde tüm öğeleri programlı olarak sıralayın veya hala süreçte ...

nasıl geçeceğim gerçekten umurumda değil

foreach ifadesi

GetNextEnum / GetLastEnum / GetFirstEnum gibi yeni işlevler

veya aşırı yük ++

asıl mesele, yukarıda önerildiği gibi, mevcut enamlar için fonksiyonlar çizmemek ve daha sonra geliştiriciler tarafından güncellendiklerinde hiçbir şeyin kırılmayacağından korkmaktır.

 

Tanrım, neden bu tür zorluklar - bazı artılar, yineleyiciler ... En açık ve esnek çözüm, tüm enum değerlerini bir diziye alan bir işlevi dile getirmektir. Ve sonra bu diziyi en azından çapraz olarak nasıl atlayacağınıza kendiniz karar verirsiniz. Ayrıca, her durumda, tüm değerleri kaydetmeniz gerekecektir. Her aramada her şeyi tekrar atlamayacaksınız. Bir kere dolaştın, kurtardın ve sonra diziden aldın. Yani hemen hazır bir dizi elde etmek daha kolay değil mi?

Bu arada, ++ operatör aşırı yükleme seçeneği, mevcut programların yanlış çalışmasına neden olabilir, bu nedenle bu son derece kötü bir seçenektir.

Burada gösterilen örnekler (durum 1: dönüş değeri1; durum 2: dönüş değeri2; durum 3:dönüş değeri3... vb.) genellikle bir aptallık örneğidir. Yeterli bir kişi tüm değerleri bir diziye koyacak ve indeksinden istenen değeri basitçe alacaktır. Ve ters problem için ikili aramayı kullanın.

 
Alexey Navoykov :

Tanrım, neden böyle zorluklar - bazı artılar, yineleyiciler ...

Evet, en azından olduğu kadar.

Pekala, burada gösterilen örnekler (durum 1: dönüş değeri1; durum 2: dönüş değeri2; durum 3: dönüş değeri3 ... vb.) genellikle bir aptallık örneğidir. Yeterli bir kişi tüm değerleri bir diziye koyacak ve indeksinden istenen değeri basitçe alacaktır. Ve ters problem için ikili aramayı kullanın.

anahtarı çok verimli