OOP, mql5의 템플릿 및 매크로, 미묘함 및 사용 기술 - 페이지 18

 
fxsaber :
 #define p_func(NAME)   Print ( #NAME " = " ,NAME)
//+------------------------------------------------------------------+
void OnStart ()
{   int QWERTY= 100 ;
   int zxcvbn= 999 ;
   p_func(QWERTY);   // QWERTY = 100
   p_func(zxcvbn);   // zxcvbn = 999

}
//+------------------------------------------------------------------+

공장!

고맙습니다!

 

이 문제를 해결하는 데 도움이 됩니다. 그래서 매크로가 있고 결국 결과를 반환하기 위해 그 안에 코드를 추가하고 싶습니다.

 #define FOR3(a,b,c,loop) { for ( int i= 0 ; i<a; i++)\
for ( int j= 0 ; j<b; j++)\
for ( int k= 0 ; k<c; k++)\
{loop;} /*код хочу дописать в этом месте и вернуть результат но эта штука работает только как void*/ }

매크로에서 결과를 반환할 수 있도록 표시된 위치에 코드를 추가할 수 있습니까? 코드를 추가해도 되지만, return을 쓰면 효과가 기대되지 않습니다. 나는 이 예를 보았다

   double Try_helper;
#define Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0 ) {          \
     printf ( "Error: %s " , MES);      \
     return 4 ;                         \
   }

여기 주제에서 반환이 작동합니다.

 
Seric29 :

이 문제를 해결하는 데 도움이 됩니다. 그래서 매크로가 있고 결국 결과를 반환하기 위해 그 안에 코드를 추가하고 싶습니다.

매크로에서 결과를 반환할 수 있도록 표시된 위치에 코드를 추가할 수 있습니까? 코드를 추가해도 되지만, return을 쓰면 효과가 기대되지 않습니다. 나는 이 예를 보았다

여기 항목에서 반환이 작동합니다.

다른 함수에 대한 포인터를 전달하는 함수 호출 (예: 루프 본문)

 int for3( int a, int b, int c, void (*loop)()) {
         for ( int i= 0 ; i<a; i++)
                 for ( int j= 0 ; j<b; j++)
                         for ( int k= 0 ; k<c; k++) 
                                loop();
         return 4 ;
}
...
void fn() {}
...
if ( for3( 1 , 2 , 3 , fn) ) printf ( "hellow world" );
 
Vict :

다른 함수에 대한 포인터를 전달하는 함수 호출 (예: 루프 본문)

나는 이것이 가능하다는 것을 몰랐지만, 내 임무는 많은 명령이 실행될 복잡한 여러 줄 매크로를 작성하는 것입니다. 아마도 매크로는 많은 명령을 실행하고 그것으로 기능을 만들 수 없을 것입니다. 때로는 루프와 같은 함수에서 추출해야 할 필요가 있습니다. 이것이 가능하다면 어쩌면 제가 말도 안되는 글을 쓰고 있을지도 모릅니다.

 
Seric29 :

나는 이것이 가능하다는 것을 몰랐지만, 내 임무는 많은 명령이 실행될 복잡한 여러 줄 매크로를 작성하는 것입니다. 아마도 매크로는 많은 명령을 실행하고 그것으로 기능을 만들 수 없을 것입니다. 때로는 루프와 같은 함수에서 추출해야 할 필요가 있습니다. 이것이 가능하다면 어쩌면 제가 말도 안되는 글을 쓰고 있을지도 모릅니다.

작업이 무엇인지, 거기에서 파고 있는지 여부는 모르겠지만 다른 접근 방식은 다음과 같습니다.

 #define CHECKCONT_INST(_NAME)                            \
bool _NAME(upindex_t start, upindex_t top)               \
   double lev_k[] = {CHECKCONT_INST_LEVELS};             \
   ...                                                   \
}                                                        \

#define CHECKCONT_INST_LEVELS
CHECKCONT_INST(check_cont_withoutlev);
#undef CHECKCONT_INST_LEVELS

#define CHECKCONT_INST_LEVELS 1.618
CHECKCONT_INST(check_cont_1618);
#undef CHECKCONT_INST_LEVELS

#define CHECKCONT_INST_LEVELS 1.618 , 2.618
CHECKCONT_INST(check_cont_2618);
#undef CHECKCONT_INST_LEVELS

check_cont_withoutlev(0, 10);
check_cont_1618(0, 10);
check_cont_2618(0, 10);

따라서 함수의 모든 부분을 교체하고(나처럼 배열을 채울 필요는 없음) 원하는 형식으로 인스턴스화할 수 있습니다.

 
#define FOR3(a,b,c,code)   \
for(int i=0; i<a; i++)     \
for(int j=0; j<b; j++)     \
for(int k=0; k<c; k++){    \
code;                      \
}

void OnStart(){

   string x="";
   FOR3(2,3,4,x=x+(string)i+","+(string)j+","+(string)k+";\n");   
   Alert(x);
   
}
 
Seric29 :

나는 이것이 가능하다는 것을 몰랐지만, 내 임무는 많은 명령이 실행될 복잡한 여러 줄 매크로를 작성하는 것입니다. 아마도 매크로는 많은 명령을 실행하고 그것으로 기능을 만들 수 없을 것입니다. 때로는 루프와 같은 함수에서 추출해야 할 필요가 있습니다. 이것이 가능하다면 어쩌면 제가 말도 안되는 글을 쓰고 있을지도 모릅니다.

가능하지만 그렇지 않습니다.

 
Dmitry Fedoseev :

가능하지만 그렇지 않습니다.

이 매크로는 무효가 됩니다. 결과를 반환하려면 계산할 표현식이 필요합니다. 즉, 내부에서 함수를 호출해야 한다는 결론에 도달했습니다.

 
Vict :

다른 함수에 대한 포인터를 전달하는 함수 호출 (예: 루프 본문)

함수 포인터를 연구했는데 솔직히 말해서 왜 변수 대신에 함수를 호출할 수 있는지 이해하지 못했습니다. 저에게는 어려울 수 있습니다. 함수 포인터는 오버로딩이나 다형성과 비슷합니다.

 
Seric29 :

함수 포인터를 연구했습니다. 솔직히 말해서 , 왜 그것이 변수인지 이해하지 못했습니다 . 사실 변수 대신에 함수를 호출할 수 있습니다. 저에게는 어려울 수 있습니다. 함수 포인터는 오버로딩이나 다형성과 비슷합니다.

특정 문제를 해결하기 위해 하위 알고리즘, 말하자면 "날카롭게" 할 수 있는 알고리즘이 있습니다. 사실상 가상 기능의 아날로그. 당신은 자신이 가장 중요한 것을 요구했지만 지금은 이유를 모릅니다.)) 프레임이 있었고 그 안에 루프가 미끄러졌습니다.