"StringToEnum" 함수 또는 대안이 있습니까? - 페이지 2

 

나는 이것을 따라 왔지만 정확히 당신이 성취하고자하는 것이 무엇인지 명확하게 이해하지 못합니다.

나는 일반적으로 내가 찾고 있던 최종 결과를 얻기 위해 다양한 방법으로 일을 다시 코딩합니다. 일들은 여러 가지 방법으로 수행될 수 있습니다.

 
Marco vd Heijden :

나는 이것을 따라 왔지만 정확히 당신이 성취하고자하는 것이 무엇인지 명확하게 이해하지 못합니다.

나는 일반적으로 내가 찾고 있던 최종 결과를 얻기 위해 다양한 방법으로 일을 다시 코딩합니다. 일들은 여러 가지 방법으로 수행될 수 있습니다.

마르코 감사합니다. 물론 여러 가지 방법(및 해결 방법)으로 작업을 수행할 수 있으며 때로는 목표를 달성하기 위해 그 중 하나를 선택해야 하지만 다른 방법보다 쉬운 방법도 있습니다. 이 경우 함수를 모방하기 위해 취한 해결 방법: StringToEnum은 "if"와 여러 문자열 비교를 사용하고 있었지만 eval 함수(mql5에서 구현되지 않음) 전에 말했듯이 모든 if를 피하는 데 도움이 될 수 있으며 유지 관리에도 도움이 됩니다. 상수가 이름을 변경하면 if 블록을 변경할 필요가 없기 때문입니다.
 

나는 내가 필요한 것을 얻기 위해 하나의 코드 블록에 수백, 때로는 수천 개의 if 라인이 있다는 것을 의미하는지 정확히 알고 있습니다.

당신은 당신이하는 일을 사랑해야합니다.

 
cyberglassed :
마르코 감사합니다. 물론 여러 가지 방법(및 해결 방법)으로 작업을 수행할 수 있으며 때로는 목표를 달성하기 위해 그 중 하나를 선택해야 하지만 다른 방법보다 쉬운 방법도 있습니다. 이 경우 함수를 모방하기 위해 취한 해결 방법: StringToEnum은 "if"와 여러 문자열 비교를 사용하고 있었지만 eval 함수(mql5에서 구현되지 않음) 전에 말했듯이 모든 if를 피하는 데 도움이 될 수 있으며 유지 관리에도 도움이 됩니다. 상수가 이름을 변경하면 if 블록을 변경할 필요가 없기 때문입니다.

이 StringToEnum이 필요한 이유를 설명해 주시겠습니까? 분명히 열거형 값이 있는 문자열이 있지만 문자열에 있는 이유는 무엇입니까? 궁금합니다.

즉, eval(...) 함수의 지원으로 많은 것을 동시에 해결할 수 있습니다.

그런 일은 절대 일어나지 않을 것입니다. 시간을 낭비하지 마세요. Eval() 함수 는 보안 누출에 대한 열린 문이며 Metaquotes는 이러한 기능을 추가하지 않습니다.

 
Marco vd Heijden :

나는 내가 필요한 것을 얻기 위해 하나의 코드 블록에 수백, 때로는 수천 개의 if 라인이 있다는 것을 의미하는지 정확히 알고 있습니다.

당신은 당신이하는 일을 사랑해야합니다.

문제 는 StringToEnum() 으로 해결할 수 없으며 이미 알고 있습니다(제 생각에는).
 
Alain Verleyen :
문제 는 StringToEnum() 으로 해결할 수 없으며 이미 알고 있습니다(제 생각에는).

정확하지만 거꾸로 할 수 있습니다.

   int b= 0 ;
  
   if ( EnumToString ( MODE_SMMA )== "MODE_SMMA" ){b= 2 ; Print ( "b= " ,b);}

그러나 MODE_SMMA는 이미 정수 값 2를 가지고 있기 때문에 의미가 없을 것입니다. 그래서 나는 사이버 안경 이 달성하려는 것을 이해하지 못한다고 썼습니다.

 
Marco vd Heijden :

정확하지만 거꾸로 할 수 있습니다.

그러나 MODE_SMMA는 이미 정수 값 2를 가지고 있기 때문에 의미가 없을 것입니다. 그래서 나는 사이버 안경 이 달성하려는 것을 이해하지 못한다고 썼습니다.

내가 사용하는 Marco 해결 방법은 다음과 같습니다(매우 미니멀한 버전).

 int StringToEnum( string strId) {
         if ( false ) {}
         else if (strId == "PRICE_CLOSE" )     return 1 ;
         else if (strId == "PRICE_OPEN" )      return 2 ;
         else if (strId == "PRICE_HIGH" )      return 3 ;
         else if (strId == "PRICE_LOW" )       return 4 ;
         else if (strId == "PRICE_MEDIAN" )    return 5 ;
         else if (strId == "PRICE_TYPICAL" )   return 6 ;
         else if (strId == "PRICE_WEIGHTED" )  return 7 ;
        // ...
         return - 1 ;
}

void OnStart () {
         string strId = "PRICE_MEDIAN" ;
         printf ( "%s: %d " , strId, StringToEnum(strId));
}

물론 상수에서 시작하지 않고 문자열에서 시작합니다. 코드에서 다음을 작성했기 때문에 이렇게 말합니다.

 EnumToString ( MODE_SMMA )

마치 처음부터 상수 자체를 가지고 있었던 것처럼.

내가 당신을 잘못 이해했다면 미안 해요, 내 영어가 너무 좋지 않습니다.

문안 인사.

 
Alain Verleyen :

이 StringToEnum이 필요한 이유를 설명해 주시겠습니까? 분명히 열거형 값이 있는 문자열이 있지만 문자열에 있는 이유는 무엇입니까? 궁금합니다.

즉, eval(...) 함수의 지원으로 많은 것을 동시에 해결할 수 있습니다.

그런 일은 절대 일어나지 않을 것입니다. 시간을 낭비하지 마세요. Eval() 함수는 보안 누출에 대한 열린 문이며 Metaquotes는 이러한 기능을 추가하지 않습니다.

안녕 Alain, 나는 당신의 호기심을 만족시킵니다 :P

여러 개의 외부 mql5 코드를 사용 중이고 여기에 정의된 여러 "열거형" 데이터 유형을 처리한다고 상상해 보십시오. 물론 사람처럼 각 "열거형"의 각 값에 대한 문자열 이름을 기억하는 것이 좋습니다. . 그런 다음 어떤 부분에서는 string 형식 의 일부 enum 값을 지정하고 싶을 때 직접 수행할 수 없으므로 위에서 쓴 대로 몇 가지 해결 방법을 사용해야 합니다. 여기에는 두 가지 큰 단점이 있습니다. 첫 번째는 관련된 모든 열거형의 모든 값을 수집해야 하고 두 번째 단점은 유지 관리입니다. 따라서 개발자가 일부 상수 표현과 관련된 int 값을 변경한 외부 mql5 코드를 업데이트하면 다음을 수행할 수 있습니다. 예기치 않은 동작이 발생하므로 코드 업데이트를 계속 검사해야 합니다.

보안 누출 주제에 대해... 보안 누출에 대한 열린 문이라는 귀하의 말에 전적으로 동의하지 않습니다. 물론 열린 문이 될 수 있지만 프로그래머는 한계를 설정하고 가능한 중요한 상황을 처리해야 합니다. PHP와 같은 상황을 완벽하게 관리할 수 있습니다. 코드 주입이 있는 SQL에서도 일부 구문을 분석해야 합니다. 사용자가 코드에 액세스할 수 있는 경우 중요한 가능한 입력 데이터입니다.

미래에는 운이 거의 없고 개발자 팀이 이 방향에 대해 약간의 도움을 줄 수 있으므로 지금은 해결 방법을 사용할 수 있습니다.P

 
cyberglassed :

내가 사용하는 Marco 해결 방법은 다음과 같습니다(매우 미니멀한 버전).

물론 상수에서 시작하지 않고 문자열에서 시작합니다. 코드에서 다음을 작성했기 때문에 이렇게 말합니다.

마치 처음부터 상수 자체를 가지고 있었던 것처럼.

내가 당신을 잘못 이해했다면 미안 해요, 내 영어가 너무 좋지 않습니다.

문안 인사.

이것이 거꾸로 호출되는 이유이며 모든 열거를 비교하여 string 에서 열거 값을 분해하는 것으로 시작합니다.

 int b;
if ( EnumToString ( MODE_SMA )== "MODE_SMA" ){b= 0 ;}
if ( EnumToString ( MODE_EMA )== "MODE_EMA" ){b= 1 ;}
if ( EnumToString ( MODE_SMMA )== "MODE_SMMA" ){b= 2 ;}
if ( EnumToString ( MODE_LWMA )== "MODE_LWMA" ){b= 3 ;}

Print (b);


하지만 같은 것이 아닌가?

일치하는 항목이 있으면 스팅을 비교하는 쪽이 중요하지 않습니다. 값은 b에 서명됩니다.

 int b;
if ( "MODE_SMA" == EnumToString ( MODE_SMA )){b= 0 ;}
if ( "MODE_EMA" == EnumToString ( MODE_EMA )){b= 1 ;}
if ( "MODE_SMMA" == EnumToString ( MODE_SMMA )){b= 2 ;}
if ( "MODE_LWMA" == EnumToString ( MODE_LWMA )){b= 3 ;}

Print (b);

그래서 여기서 우리는 문자열 값으로 시작하지만 차이점은 무엇입니까?

없음.

 
Marco vd Heijden :

...

하지만 같은 것이 아닌가?

일치하는 항목이 있으면 스팅을 비교하는 쪽이 중요하지 않습니다. 값은 b에 서명됩니다.

 int b;
if ( "MODE_SMA" == EnumToString ( MODE_SMA )){b= 0 ;}
if ( "MODE_EMA" == EnumToString ( MODE_EMA )){b= 1 ;}
if ( "MODE_SMMA" == EnumToString ( MODE_SMMA )){b= 2 ;}
if ( "MODE_LWMA" == EnumToString ( MODE_LWMA )){b= 3 ;}

Print (b);

그래서 여기서 우리는 문자열 값으로 시작하지만 차이점은 무엇입니까?

없음.

위의 코드는 항상 "b = 3"을 반환하기 때문에 쓸모가 없습니다("else if"를 사용하지 않기 때문에 마지막 "if").

"else if"를 사용하면 항상 "b = 0"을 반환합니다.

어쨌든 info: "b = 3"은 매번 정보를 제공하지 않습니다.

사유: