Hatalar, hatalar, sorular - sayfa 2347

 
Andrey Khatimlianskii :

Ancak farklı kütüphaneler için bunu uygulamayı da başaramadım. Bu tür makro ikameleriyle birkaç kitaplığı bir satırda bağlamak ve böylece OnTick çağrıldığında tüm kitaplıkların OnTick'i çağrılır.

Güçlü bir şekilde, alınması arzu edilen bir örnekle bile yetişemediğim bir şey. Gösterebilirsin?


Not Yöneticiye gelince, burada EventBase.mqh'ye bakın. Aptalca herkesi mirasçı yaptı ve yeni bir nesne ortaya çıktığında, işaretçisi her On-olayda for döngüsü tarafından çağrılan genel listeye düştü.

 
fxsaber :

Güçlü bir şekilde, alınması arzu edilen bir örnekle bile yetişemediğim bir şey. Gösterebilirsin?

Sınıfım_1.mqh:

 class Myclass_1
  {
public :
   void                OnInit (){ Print ( "Init 1" );};
  };


Sınıfım_2.mqh:

 class Myclass_2
  {
public :
   void                OnInit (){ Print ( "Init 2" );};
  };


Uzman.mq5:

 #include <MyClass_1.mqh>
#include <MyClass_2.mqh>

Myclass_1 m_class_1;
Myclass_2 m_class_2;

void OnInit ( void )
{
   Print ( "Init EA" );
}


Yürütme sonucunda 3 baskının tümünü almak için: "Init 1", "Init 2" ve "Init EA"

 

Merhaba.

Bir EA'dan bir fonksiyon çağırıyorum   IndicatorParameters , ancak 4014 hatası alıyorum. Bu neden - söyle bana? 1960 inşa.

 
Andrey Khatimlianskii :

Bu tür makro ikameleriyle birkaç kitaplığı bir satırda bağlamak ve böylece OnTick çağrıldığında tüm kitaplıkların OnTick'i çağrılır.

Lib (class##libname) adına göre bir sınıf oluşturan ve sarmalayıcının (libname::oninit) içini çağırmak için bağlamı kullanan içe aktarmanın etrafına bir makro sarmalayıcı yapın.

Eh, sınıf söz konusu yöneticiye kaydırılır.

sadece her ayrı hat için.

 
TheXpert :

Lib adına göre bir sınıf oluşturan içe aktarmanın etrafına bir makro sarmalayıcı yapın (class##libname)

Bu benim için çok karmaşık, google'a gittim.

 
Kuzmich :

Merhaba.

Bir EA'dan bir fonksiyon çağırıyorum   IndicatorParameters , ancak 4014 hatası alıyorum. Bu neden - söyle bana? 1960 inşa.

peki, eğer 3 kapsayıcınız varsa, yukarıda yayınladığım kodum çalışmalı, ancak her sınıf için makro ikameleri yazmanız gerekiyor, işte örneğim, işe yarıyor gibi görünüyor ama yine de kontrol edeceğim:

 class Myclass
  {
public :
                     Myclass(){};
                    ~Myclass(){};
   void                OnInit ()  { Print ( __FUNCSIG__ , " выполнен" );};
   void                OnDeinit ( int Reason){ Print ( __FUNCSIG__ , " выполнен" );}
   void                OnTick ()  { Print ( __FUNCSIG__ , " выполнен" );};
   void                OnTimer () { Print ( __FUNCSIG__ , " выполнен" );};
  } m_class;
//+------------------------------------------------------------------+
#define MyClassOnInit m_class. OnInit ();
void OnInit ( void ){ MyClassOnInit; EventSetMillisecondTimer ( 300 ); ::MyClassOnInit_(); }
#define OnInit MyClassOnInit_
//+------------------------------------------------------------------+
#define MyClassOnDeinit(Reason) m_class. OnDeinit (Reason);
void OnDeinit ( const int Reason ){ MyClassOnDeinit(Reason); ::MyClassOnDeinit_(Reason); }
#define OnDeinit MyClassOnDeinit_
//+------------------------------------------------------------------+
#define MyClassOnTimer m_class. OnTimer ();
void OnTimer ( void ){ MyClassOnTimer; ::MyClassOnTimer_(); }
#define OnTimer MyClassOnTimer_
//+------------------------------------------------------------------+
#define MyClassOnTick m_class. OnTick ();
void OnTick ( void ){ MyClassOnTick; ::MyClassOnTick_(); }
#define OnTick MyClassOnTick_
//+------------------------------------------------------------------+

ve EA koduna sadece bir tane ekledim #include <fileMyclass.mqh>

örneğinizde, üç dosyanın tümünün (kodun en altında) makro değiştirmelerimle kapatılması gerekir (ve m_class2 , m_class3 ... adlarını değiştirin)

Andrey Khatimliansky :

Aynı türden bir sınıf için, çözüm zaten önerildi: onu CObject'den devralın ve yönetici sınıfına, eklenen tüm örnekleri CArrayObj'de depolayacak, üzerinde yinelenecek ve gerekli OnXXX işlevini çağıracak bir makro ikamesi ekleyin.

Ancak farklı kütüphaneler için bunu uygulamayı da başaramadım. Bu tür makro ikameleriyle birkaç kitaplığı bir satırda bağlamak ve böylece OnTick çağrıldığında tüm kitaplıkların OnTick'i çağrılır.

bir örnek gerekli, nasıl olduğunu bilmiyorum ve “sınıf yöneticisinde makro değiştirme” ile çalışmadım

 
Andrey Khatimlianskii :

Yürütme sonucunda 3 baskının tümünü almak için: "Init 1", "Init 2" ve "Init EA"

Yönetici yap. Yukarıdaki kaynağın bir örneği gösterildi. Makrolar başka bir şey içindir.

 
Andrey Khatimlianskii :

Bu benim için çok karmaşık, google'a gittim.

Genel olarak, güzel sonuç vermez, ancak rekoru mümkün olduğunca şu şekilde azaltmak mümkündür:

 // for libsample
#import "libsample.ex5"
IMPORT_EA_INTERFACE // здесь список импортируемых функций. они по идее одинаковые, поэтому можно в отдельный дефайн
#import
DECLARE_AND_REGISTER(libsample) // здесь генерация класса-обертки для libsample который обернет импортированные функции и зарегистрируется в менеджере
 

İşte doğrudan bir çağrı ve yönetici olmadan örnek bir uygulama.

 #define IMPORT_EA_INTERFACE \
void f1(); \
void f2(); \

#define DECLARE_AND_REGISTER(x) \
class ImportFrom_ ##x \
{ \
public : \
   static void f1() { x::f1();} \
   static void f2() { x::f2();} \
}; \

#import "libsample.ex5"
IMPORT_EA_INTERFACE
#import
DECLARE_AND_REGISTER(libsample)

#import "libsamplesecond.ex5"
IMPORT_EA_INTERFACE
#import
DECLARE_AND_REGISTER(libsamplesecond)

void OnStart ()
{
   ImportFrom_libsample::f1();
   ImportFrom_libsample::f2();

   ImportFrom_libsamplesecond::f1();
   ImportFrom_libsamplesecond::f2();
}

ImportFrom sınıfının yönetici ile kaydı varsa ve statik olmayan işlevler varsa, içe aktarılan veya

 
TheXpert :

İşte doğrudan bir çağrı ve yöneticisiz bir örnek uygulama.

ImportFrom sınıfının yönetici ile kaydı varsa ve statik olmayan işlevler varsa, içe aktarılan veya

Fikri anladım, teşekkürler.

%100 şeffaf değil ama şu anda olduğundan daha iyi.

Neden: