열거 형을 순차적으로 반복하는 방법은 무엇입니까? - 페이지 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 함수를 사용하고 나면 반환하면 이점이 있습니다.

 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 :

열거형 증가 - "다음" 값을 즉시 가져옵니다.

Ilyas 는 이것을 의미했습니다

그나 담당 개발자에게 질문이 있었습니다. 이 작업은 해결되었습니다. 어떻게든 프로그래밍 방식으로 모든 요소를 정렬하거나 아직 진행 중인 ...

어떻게 헤쳐나갈지 난 별로 신경쓰지 않아

foreach 문

GetNextEnum / GetLastEnum / GetFirstEnum과 같은 새로운 기능

또는 과부하 ++

중요한 것은 위에서 제안한 것처럼 현재 enam에 대한 기능을 그리는 것이 아니라 개발자가 업데이트할 때 아무 것도 손상되지 않을 것을 두려워하는 것입니다.

 

맙소사, 왜 그런 어려움 - 몇 가지 장점, 반복자 ... 가장 명확하고 유연한 솔루션은 모든 열거형 값 을 배열로 받는 언어에 함수를 도입하는 것입니다. 그런 다음 최소한 십자형으로 이 배열을 우회하는 방법을 스스로 결정합니다. 또한 어떤 경우에도 모든 값을 저장해야 합니다. 각 통화에서 모든 것을 다시 건너뛰지는 않을 것입니다. 한 번 돌아다니며 저장한 다음 어레이에서 가져오기만 하면 됩니다. 그래서 바로 기성품 어레이를 얻는 것이 더 쉽지 않습니까?

그건 그렇고, ++ 연산자 오버로딩 옵션은 이미 존재하는 프로그램의 잘못된 연산으로 이어질 수 있으므로 이것은 매우 나쁜 옵션입니다.

음, 여기에 표시된 예(사례 1: 반환 값1, 사례 2: 반환 값2, 사례 3: 반환 값3... 등)는 일반적으로 어리석음의 샘플입니다. 적절한 사람은 모든 값을 배열에 넣고 단순히 인덱스로 원하는 값을 얻습니다. 역 문제의 경우 이진 검색 을 사용하십시오.

 
Alexey Navoykov :

하나님, 왜 그러한 어려움-일부 플러스, 반복자 ...

예, 적어도 그랬습니다.

음, 여기에 표시된 예(사례 1: 반환 값1, 사례 2: 반환 값2, 사례 3: 반환 값3... 등)는 일반적으로 어리석음의 샘플입니다. 적절한 사람은 모든 값을 배열에 넣고 단순히 인덱스로 원하는 값을 얻습니다. 역 문제의 경우 이진 검색을 사용하십시오.

스위치는 매우 효율적입니다