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

 
fxsaber #:
Esse é um resultado interessante.

É estranho que ainda não tenha sido corrigido:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bugs, bugs, perguntas

A100, 2020.08.01 05:42

Erro durante a execução:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Result: OnStart::unnamed#00000216656562DC80::f<ulong>

Esperado: OnStart::f<ulong>


 
fxsaber #:
Limitação do compilador.

Esse é um defeito óbvio - acho que o compilador já deveria chamar uma equipe médica para esse tipo de código

É hipoteticamente possível imaginar parênteses em macros aninhadas em tal quantidade, mas não colchetes.
 
Informe se esse é o comportamento correto ou não, em que a sequência de inicialização dos campos de um objeto de estrutura/classe depende da disposição mútua dos campos e não das entradas após o construtor?
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

A expectativa era inicializar da esquerda para a direita, conforme especificado no construtor.

C() : i(this.Count++), j(this.Count++) {}

Porém, descobriu-se que a inicialização vai de cima para baixo por campos. E a sequência especificada de inicialização após o construtor não é importante. Isso está correto?

 
fxsaber #:
Por favor, informe se esse é o comportamento correto ou não, em que a sequência de inicialização dos campos de um objeto de estrutura/classe depende da disposição mútua dos campos e não das entradas após o construtor?

A expectativa era inicializar da esquerda para a direita, conforme especificado no construtor.

Porém, descobriu-se que a inicialização vai de cima para baixo por campos. E a sequência especificada de inicialização após o construtor não é importante. Isso está correto?

Por que os desenvolvedores escrevem uma ajuda tão detalhada se ninguém a lê? Sugiro simplificar a ajuda em uma frase: Pergunte no fórum - eles o ajudarão!

 
A100 #:

Por que os desenvolvedores escrevem uma ajuda tão detalhada se ninguém a lê? Proponho simplificar a ajuda em uma frase: Pergunte no fórum - eles o ajudarão!

Quando o esquema de encontrar a resposta para uma pergunta na ajuda estiver claro, recorrerei à ajuda do fórum com menos frequência.

 
fxsaber #:

Quando eu entender o esquema de encontrar a resposta para a pergunta na ajuda, usarei o fórum com menos frequência.


Em "Tipos de dados" -> "Estruturas e classes".

Na lista de inicialização, os membros podem estar em qualquer ordem, mas todos os membros da classe serão inicializados de acordo com a ordem de sua declaração.
 
Sergey Gridnev #:

Em "Data Types" (Tipos de dados) -> "Structures and Classes" (Estruturas e classes)

Na lista de inicialização, os membros podem estar em qualquer ordem, mas todos os membros da classe serão inicializados de acordo com a ordem em que forem declarados.

Obrigado. Infelizmente, nem sempre fica claro onde e como procurar.

 
fxsaber #:

Obrigado. Infelizmente, nem sempre é claro onde e como procurar.

Sim, é.
 

Encontrei uma coisa muito desagradável no trabalho do indicador (MT5 e MT4).
Os eventos bloqueiam o trabalho do cronômetro.
Não existe tal coisa no Expert Advisor.
Mais uma vez, estou convencido de que não faz sentido usar indicadores em que é necessário um trabalho estável do cronômetro. Isso é especialmente verdadeiro para interfaces responsivas.

Aqui está um indicador que demonstra esse problema, em que o cronômetro é definido para 20 milissegundos e o tempo entre os eventos do cronômetro é exibido se exceder 100 milissegundos.

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+



 
Adicionado.
template <typename T>
class A
{
public:  
  void f() const { ::Print(typename(T)); }
};

void OnStart()
{
  const A<MqlTick> a;
  
  a.f(); // struct MqlTick
}
Razão: