Erros, bugs, perguntas - página 2755

 

Erro de compilação. Funciona bem em construções mais antigas.

struct A { };

template<typename T> 
struct B : T { };  // 'A' - unexpected token

struct C : B<A> { };
 

Tenho um Expert Advisor tão simples (ver imagem do ecrã).

Há objectos do mapa sobrepostos no mapa.

Antes da actualização terminal de ontem os níveis comerciais eram mostrados nos gráficos, mas agora desapareceram.

Criei gráficos como mostra o exemplo no manual. Não encontrei quaisquer propriedades de gráficos para exibir níveis de comércio (só os gráficos básicos têm tais propriedades).

Por favor, ajudem.

Capturas de ecrã da plataforma MetaTrader

GBPUSD, M5, 2020.05.25

Forex Club International Limited, MetaTrader 5, Real

GBPUSD, M5, 2020.05.25, Forex Club International Limited, MetaTrader 5, Real


Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
  • www.mql5.com
//| Создает объект "График"                                          |               chart_ID=0,                               sub_window=0,                             x=0,                                      y=0,                                      width=300,                                height=200,               ...
 

Hi. Por favor, ajude-me a compreender o que está escrito.

mqlrate rt [2] ;

Estou correcto ao assumir que se trata de um conjunto de duas estruturas que receberam automaticamente os mesmos dados estruturais?

Além disso, não há atribuição de dados à matriz e depois os dados da matriz são utilizados de uma só vez.
 
Ivan_Invanov:

Hi. Por favor, ajude-me a compreender o que está escrito.

mqlrate rt [2] ;

Estou correcto ao assumir que se trata de um conjunto de duas estruturas que receberam automaticamente os mesmos dados?

Escrito em MQL5:

MqlRates rt[2]

significa: é declarado um conjunto estático de duas estruturasMqlRates. Após a declaração, estas estruturas podem armazenar algaraviadas, pelo que estas estruturas têm de ser explicitamente preenchidas com dados.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Константы, перечисления и структуры / Структуры данных / Структура исторических данных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Escrita em MQL5:

significa: é declarado um conjunto estático de duas estruturasMqlRates. Uma vez declaradas, estas estruturas podem armazenar algaraviadas, pelo que estas estruturas precisam de ser explicitamente preenchidas com dados.

Obrigado.
 
Alexey Navoykov:

Erro de compilação. Funciona bem em construções mais antigas.

Sim, existe tal coisa, reportado já em 2020.03.25, já dia após dia durante 2 meses...
(
não corrigido pelo MT5(build 2390)) (novo) Erro de Compilação, quando se usa o modificador de acesso padrão ao herdar na classe do modelo, quando o parâmetro do modelo actua como classe base.

 

Outro insecto:

class A
{
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
};

class D : public C
{
 public:
  void operator=(A const& other) { }
};

void OnStart()
{
  C c;
  D d;
  d = c; // attempting to reference deleted function 'void C::operator=(const C&)'
}

Culpa C::operator=, embora D::operator= seja executado aqui. Para evitar o bug, temos de sobrecarregar o operador para todas as classes de base na hierarquia.


p.s. Em geral, os programadores prometeram corrigir o comportamento incorrecto do operador de atribuição há muito tempo, mas ainda lá está. Isto é um ultraje. Por exemplo, o seguinte código compila sem erros, embora esteja a atribuir o que quer que seja:

#include <Expert\Expert.mqh>

#include <Strings\String.mqh>

void OnStart()
{
  CExpert Expert;
  CString String;
  Expert = String; // Ошибки нет. Типа всё нормально?
}
 
Alexey Navoykov:

Mais um bug:
1) Queixa-se de C::operator=, embora D::operator= seja executado aqui. Para evitar o bug, temos de sobrecarregar o operador para todas as classes de base na hierarquia.
2) Em geral, os programadores prometeram corrigir o comportamento incorrecto do operador de atribuição há muito tempo mas ele ainda lá está - é um ultraje. Por exemplo, o seguinte código compila sem erros embora atribua o que quer que seja:

1) Isto não é muito provavelmente um bug mas sim um comportamento natural, considerando as especificidades do MQL, nomeadamente:
Em MQL, os métodos e campos da classe base estão "directamente disponíveis" a partir das classes derivadas.
Em essência, o comportamento da herança em MQL é semelhante à utilização da declaração para cada campo e método básico em C++.
C++ online:https://onlinegdb.com/rJkckvFsU

class A
{
public:
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
public:
    //void operator=(C const& other) { printf("C");}
};

class D : public C
{
public:
#ifdef __cplusplus
  using A::operator=;
  using B::operator=;
  using C::operator=;
#endif
  void operator=(A const& other) { printf("D");}
};

void OnStart()
{
  C c;
  D d;
  d = c; 
}



Assim, a operaçãod = c;
também envolve todas as funções operador= das classes base quando se procura a função apropriada.
Como resultado, a assinatura ideal para uma chamada de função sobrecarregada é o operador predefinido e apagado =(const C&).

 
Sergey Dzyublik:

1) Muito provavelmente, não é um bug, mas um comportamento natural considerando as peculiaridades do MQL, nomeadamente:
Em MQL, os métodos e campos de uma classe base estão "directamente disponíveis" a partir de classes descendentes.
Em essência, o comportamento da herança em MQL é semelhante ao de C++ usando declaração para cada campo e método básico.
C++ online:https://onlinegdb.com/rJkckvFsU


Assim, a operaçãod = c;
também envolve todas as funções operador= das classes base quando se procura a função apropriada.
Como resultado, a assinatura óptima para uma chamada de função sobrecarregada é o operador predefinido e remoto nulo=(const C&).

Não é preciso procurar um significado sagrado numa falha óbvia da linguagem. Já levantei aqui este problema e Ilyas garantiu que será corrigido. Mas já passaram quase 10 meses. (

Na essência, o comportamento da herança no MQL é semelhante ao do C++ usando declaração

Sim, bem, se em MQL por exemplo 2 x 2 = 5, pode-se dizer que é o mesmo que em C++ adicionando uma operação de incremento ao resultado)

 
Alexey Navoykov:

Não é necessário procurar um significado sagrado numa falha óbvia da língua.

Foi-lhe explicado como e porquê funciona, se é difícil para si - felizmente não posso ajudar...
Não é um significado sagrado, mas uma abordagem comum para baixar o nível de entrada do utilizador, para que este possa aceder aos campos e métodos da classe base sem utilizar "isto", e também em casos de sobrecarga - uma função de classe base.