OOP, mql5'te şablonlar ve makrolar, incelikler ve kullanım teknikleri - sayfa 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

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

İşler!

Teşekkür ederim!

 

Bu sorunu çözmeye yardımcı olun. Yani bir makro var ve sonunda sonucu döndürmek için içine kod eklemek istiyorum.

 #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*/ }

Makrodan sonucu döndürmek için kodu belirtilen yere eklemek mümkün müdür? Kodu ekleyebilirsiniz, denedim, ancak dönüş yazarsanız, etki beklenmez. bu örneği gördüm

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

burada konuyla ilgili dönüş çalışmaları var.

 
Seric29 :

Bu sorunu çözmeye yardımcı olun. Yani bir makro var ve sonunda sonucu döndürmek için içine kod eklemek istiyorum.

Makrodan sonucu döndürmek için kodu belirtilen yere eklemek mümkün müdür? Kodu ekleyebilirsiniz, denedim, ancak dönüş yazarsanız, etki beklenmez. bu örneği gördüm

burada konuyla ilgili dönüş çalışmaları var.

Başka bir işleve işaretçi ilettiğiniz bir işlevi çağırın (örneğin, döngü gövdesi)

 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 :

Başka bir işleve işaretçiilettiğiniz bir işlevi çağırın (örneğin, döngü gövdesi)

Bunun yapılabileceğini bilmiyordum, ama benim görevim birçok komutun yürütüleceği karmaşık bir çok satırlı makro yazmak, muhtemelen bir makro birçok komutu yürütemez ve bundan bir işlev yapabilir mi? Bazen bir fonksiyondan örneğin bir döngüden ayıklamak gerekiyor, bu mümkünse belki saçma sapan yazıyorum diye düşündüm.

 
Seric29 :

Bunun yapılabileceğini bilmiyordum, ama benim görevim birçok komutun yürütüleceği karmaşık bir çok satırlı makro yazmak, muhtemelen bir makro birçok komutu yürütemez ve bundan bir işlev yapabilir mi? Bazen bir fonksiyondan örneğin bir döngüden ayıklamak gerekiyor, bu mümkünse belki saçma sapan yazıyorum diye düşündüm.

Görevin ne olduğunu ve orada kazı yapıp yapmadığınızı bilmiyorum, ancak hazırlıksız - başka bir yaklaşım:

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

Böylece işlevin herhangi bir parçasını değiştirebilir (sahip olduğum gibi diziyi doldurmaya gerek yoktur) ve istediğiniz biçimde somutlaştırabilirsiniz.

 
#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 :

Bunun yapılabileceğini bilmiyordum, ama benim görevim birçok komutun yürütüleceği karmaşık bir çok satırlı makro yazmak, muhtemelen bir makro birçok komutu yürütemez ve bundan bir işlev yapabilir mi? Bazen bir fonksiyondan örneğin bir döngüden ayıklamak gerekiyor, bu mümkünse belki saçma sapan yazıyorum diye düşündüm.

Mümkün, ama öyle değil.

 
Dmitry Fedoseev :

Mümkün, ama öyle değil.

Bu makro geçersiz olacak, ondan sonucu döndürmek için hesaplanacak bir ifadeye ihtiyacınız var, yani içinde bir fonksiyon çağırmanız gerekiyor, bu sonuca vardım.

 
Vict :

Başka bir işleve işaretçiilettiğiniz bir işlevi çağırın (örneğin, döngü gövdesi)

İşlev işaretçisini inceledim, dürüst olmak gerekirse, neden olduğunu anlamadım, aslında bir değişken yerine bir işlev çağırabilirsiniz, benim için zor olabilir, işlev işaretçisi aşırı yüklemeyi veya çok biçimliliği andırıyor.

 
Seric29 :

İşlev işaretçisini inceledim, dürüst olmak gerekirse , neden olduğunu anlamadım , aslında, bir değişken yerine bir işlev çağırabilirsiniz, benim için zor olabilir, işlev işaretçisi aşırı yüklemeyi veya polimorfizmi andırıyor.

İçine bir alt algoritma yapıştırabileceğiniz, tabiri caizse, belirli bir sorunu çözmek için onu "keskinleştirebileceğiniz" bir algoritmanız var. Aslına bakarsanız - sanal fonksiyonların analogu . Ana şeyi kendiniz istediniz, ama şimdi nedenini bilmiyorsunuz))), içinde bir döngü kaydırdığınız bir çerçeveniz vardı.