Erros, bugs, perguntas - página 2347

 
Andrey Khatimlianskii:

Mas também não consegui implementá-lo para diferentes bibliotecas. Ligar várias bibliotecas com tais macros numa só linha e chamar OnTick para todas as bibliotecas.

Não compreendo realmente nem mesmo um exemplo, o que eu quero obter. Pode mostrar-me?


ZZZ Quanto ao gerente, ver. EventBase.mqh aqui. Estupidamente fez de todos um herdeiro e quando um novo objecto apareceu, o seu ponteiro foi para uma lista comum, que foi chamada por um laço em cada evento.

 
fxsaber:

Não consigo sequer ter um exemplo do que quero obter. Pode mostrar-me?

MyClass_1.mqh:

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


MyClass_2.mqh:

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


Expert.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" );
}


Para obter as 3 impressoras como resultado da execução: "Init 1", "Init 2" e "Init EA".

 

Olá a todos.

Chamo a funçãoIndicatorParameters de especialista, mas recebo erro 4014. O que é que pode ser - por favor aconselhar? Construir 1960.

 
Andrey Khatimlianskii:

Para ligar várias bibliotecas com tais macros numa só linha, e para ligar à OnTick para ligar a todas as bibliotecas OnTick.

Faça um macro wrapper em torno da importação que forma uma classe pelo nome da biblioteca (classe##libname) e usa o contexto para a chamada dentro do wrapper (libname::oninit)

e a classe é despejada para o gestor acima referido.

mas para cada libra uma linha separada.

 
TheXpert:

Fazer uma macro capa em torno da importação que forma uma classe com o nome da biblioteca (classe##libnome)

Isto é um pouco complicado para mim, por isso vou procurá-lo no Google.

 
Kuzmich:

Olá a todos.

Chamo a funçãoIndicatorParameters de especialista, mas recebo erro 4014. O que é que pode ser - por favor aconselhar? Construir 1960.

Se tiver 3 inludniks, então o meu código deve funcionar, mas para cada aula deve prescrever substituições macro, aqui está o meu exemplo, parece funcionar, mas vou verificar ainda:

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_
//+------------------------------------------------------------------+

e no código Expert Advisor apenas incluo um #include <fileMyclass.mqh>

no seu exemplo, os três ficheiros devem ser fechados (no fundo do código) com as minhas substituições de macro (e substituir os nomes m_class2 , m_class3...)

Andrey Khatimlianskii:

Solução já sugerida para classe de um tipo: herdá-la do CObject, e adicionar substituição de macro ao gestor de classe que armazenará todas as instâncias adicionadas no CArrayObj, fazer loop através dele e chamar a função OnXXX necessária.

Também não tenho conseguido implementar isto em diferentes bibliotecas. Para ligar várias bibliotecas com tais macros numa só linha, e para chamar OnTick de todas as bibliotecas.

exemplo é necessário, não sei como e não funcionou com "substituição macro no gestor de classe".

 
Andrey Khatimlianskii:

Para resultar nas 3 impressões: "Init 1", "Init 2" e "Init EA".

Gerente. O exemplo do código-fonte acima apresentado. As macros são para outras coisas, no entanto.

 
Andrey Khatimlianskii:

É um pouco complicado para mim, por isso pesquisei-o no Google.

Não vai ser bonito, mas pode reduzi-lo a algo como isto:

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

Aqui está uma chamada directa e um exemplo de implementação sem gestor.

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

Se ImportFrom class tiver registo de gestor e funções não-estáticas, tudo pode ser chamado automaticamente para todos os importados

 
TheXpert:

Aqui está uma chamada directa e um exemplo de implementação sem gestor.

Se ImportFrom class tiver registo de gestor e funções não-estáticas, tudo pode ser chamado automaticamente para todos os importados

Tive a ideia, obrigado.

Não 100% transparente, mas melhor do que é neste momento.