Características da linguagem mql5, subtilezas e técnicas - página 112

 
Alexey Navoykov:
A propósito, cheguei à conclusão de que no caso geral, se o tipo de valor de retorno da função é absolutamente qualquer tipo, o problema não pode ser resolvido por meios MQL. Requer declinar tipo, que não está presente aqui.

O ponteiro regressará, mas a estrutura - não pensei que assim fosse. Deve ser por referência, afinal de contas.

 
fxsaber:

É a mesma coisa.

Agora 2 argumentos são passados para a função em vez de 3 :

MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)
 
Alexey Navoykov:

Agora, geralmente são passados 2 argumentos para a função em vez de 3 :

Dois é absolutamente o problema original. E três é a sua generalização.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Erros, bugs, perguntas

fxsaber, 2018.12.21 22:15

Deixem-me esclarecer que NewHandle - pode ser uma constante. Isto é, chamada válida
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.
A partir dos exemplos, parece claro o que é exigido da macro.
 

A norma C++ não define esta ordem e deixa-a ao critério do compilador. O revelador MQL deve certificar-se de que esta ordem pode ser alterada ou se existem planos para a alterar no futuro.

Por conseguinte, esta é a melhor maneira de o fazer:

template <typename T1, typename T2>
T2 MacrosFunc( const T1 handle, const T2 Value )
{
  SelectHandle(Memory(handle, false));
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(A,  SelectHandle(Memory(A)) ? (B) : NULL)
 
Alexey Navoykov:

A norma C++ não define esta ordem e deixa-a ao critério do compilador. O revelador MQL deve certificar-se de que esta ordem pode ser alterada ou se existem planos para a alterar no futuro.

Portanto, este caminho é melhor:

Sim, é mais fiável.

 

Estou f*cked, caros redactores.

Dar o código a um intérprete sem compreender como o intérprete interpretará o código. A estrada alta.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

fxsaber, 2018.12.21 10:23

Não consigo perceber, por favor peça-me uma dica. Há uma tal aquisição de tempo

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


Como escrever uma macro que faz a mesma coisa

time = MACROS(NewHandle, TimeCurrent()); // Макрос


O problema é que o PrevHandle não é criado na macro.

Não percebo porque é que a minha solução é pior, vou colá-la também aqui:

//handle_t MACROS_helper_PrevHandle;
int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define  MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)

Notável - implementação do operador de vírgula através do operador de tendência (bem, nada brilhante, mas é a primeira vez que o encontro).

Não é claro - porquê puxar um tipo de cabo através de um modelo? Se houvesse diferentes tipos de pegas, não é nada de mais. E em geral, o tipo de cabo será especificado através de typedef/define.

 
pavlick_:

Não vejo como a minha solução é pior, vou colocá-la também aqui:

De salientar - implementação de operador de vírgula através de operador de tendência (bem, nada de especial, mas é a primeira vez que me deparo com ela).

Não está claro - porque devemos puxar um tipo de cabo através de um modelo? Se houvesse diferentes tipos de pegas, não é nada de mais. E em geral, o tipo de cabo será especificado através de typedef/define.

Não é nada bom. O que é o cabo?

 
Алексей Тарабанов:

Não é nada bom. O que é o cabo?

A condição da tarefa era: existe algum ambiente que muda através de um descritor (manípulo), e é necessário implementar numa macro:

1. Lembre-se da pega actual

2. Mudar o ambiente para a nova pega

3. Recuperar o parâmetro requerido do ambiente

4. Mudar ambiente para cabo antigo

5. Parâmetro de retorno

 
pavlick_:

A condição da tarefa era: existe algum ambiente que muda através de um descritor (manípulo), e é necessário implementar numa macro:

1. Lembre-se da pega actual

2. Mudar o ambiente para a nova pega

3. Recuperar o parâmetro desejado do ambiente

4. Mudar o ambiente para o antigo cabo

5. Parâmetro de retorno

Obrigado pela sua resposta.