Erros, bugs, perguntas - página 1856

 
Andrey Dik:

Como posso ver a codificação?
Sei que mudou ao alterar a aparência do texto num editor de terceiros, mas como dizer qual a codificação que não conheço.
Andrey Khatimlianskii:
Acabou de criar uma EA em ME 1580: Win-1251 (ANSI)

Sim, com Akepad vejo que a codificação é Win-1251 (ANSI), mas os ficheiros mais antigos têm UTF-16LE 1200.

Então altera a codificação padrão para novos ficheiros?

 

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Características da linguagem mql5, subtilezas e truques

fxsaber, 2017.04.14 11:40

Sim, corretores corruptos. Eles também colocariam aí números negativos.

Seria bom que os criadores tivessem um limite na gama de valores possíveis de cada parâmetro quando os corretores estabelecem os símbolos.

 

Reparei que quando actualizo produtos do mercado - todas as definições para esse produto nos gráficos são repostas a valores por defeito.

Isto não está certo, como pode isto ser evitado?

 

ArrayMaximum() e ArrayMinimum() - a ordem em que os parâmetros são passados não corresponde à ajuda:


 
fxsaber:
Um pouco de know-how. Contornar o operador de atribuição

Resultado

Não é uma dica, é uma perversão.

Não esperava isso de si.

 
Koldun Zloy:

Não é um truque inteligente, é uma perversão.

Não o esperava de si.

Portanto, isto é para si

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

Bibliotecas: TypeToBytes

fxsaber, 2017.04.13 13:34

Um exemplo de como esta característica pode ser útil para a identificação de potenciais erros.

Escrever e executar o guião.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


Resultado.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

Isto indica que o operador de atribuição não copiará a estrutura para uma estrutura do mesmo tipo.


Se acrescentarmos mais à estrutura,

  void operator =( STRUCT &Value ) { this.i = 0; }

o resultado será o mesmo.


Pode parecer que ao mudar este operador para

  void operator =( STRUCT &Value ) { this.i = Value.i; }

mas a biblioteca diz o contrário.


Este é talvez o ponto mais subtil deste exemplo.

Corrigi-lo por

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

e obtém-se o resultado

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


Agora o operador da cópia está correcto!

Podemos verificar a correcção da atribuição/cópia de operadores de qualquer estrutura simples da mesma forma.

 

1. Quando escrevemos desta forma:

STRUCT StructCopy1 = Struct;
Não é o operador= que deve ser chamado, mas sim o construtor da cópia.

Embora, essa seja mais uma questão para as Metaquotes.

2. Se o construtor de cópias criado pelo compilador não for chamado, podemos ser nós a escrevê-lo.

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

Agora operator= não é chamado.

3. Uma vez que os membros da estrutura estão disponíveis para nós, podemos simplesmente escrevê-la dessa forma:

StructCopy1.i = Struct.i;

Mas se os tornar privados, então o seu gancho de ponta também não vai ajudar.

4. e mais importante: operator= é utilizado para assegurar que todas as atribuições passem por ele e não o contornem.

Normalmente, o construtor de cópias é definido em conjunto com ele.

Sim, olhei para a amostra. Não vi muito lucro.

 
Koldun Zloy:

1. Quando escrevemos desta forma:

Não é o operador= que deve ser chamado, mas sim o construtor da cópia.

Embora, essa seja mais uma questão para as Metaquotes.

2. Se o construtor de cópias criado pelo compilador não for chamado, podemos ser nós a escrevê-lo.

Agora operator= não é chamado.

3. Uma vez que os membros da estrutura estão à nossa disposição, podemos simplesmente escrevê-la dessa forma:

Mas se os tornar privados, então o seu gancho de ponta também não vai ajudar.

4. e mais importante: operator= é utilizado para assegurar que todas as atribuições passem por ele e não o contornem.

Normalmente, o construtor de cópias é definido em conjunto com ele.

Sim, olhei para a amostra. Não vi muito lucro.

A Lifehack também contorna o construtor de cópias. E o benefício está aqui
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_R é uma coisa universal. É por isso que não precisamos de redefinir as estruturas alienígenas com os seus próprios operadores.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

Sim, com Akepad vejo que a codificação é Win-1251 (ANSI), mas os ficheiros mais antigos têm UTF-16LE 1200.

A codificação padrão para os novos ficheiros mudou afinal de contas?

Não, foi sempre Win-1251 (ANSI) e UTF foi acrescentado em algum momento. Mas apenas para os ficheiros de origem que contenham caracteres não-Ansi.
 
Andrey Khatimlianskii:
Não, foi sempre Win-1251 (ANSI) e em algum momento foi acrescentado UTF. Mas apenas para as fontes que contêm caracteres não-Ansi.
Estou a ver. Obrigado.