Erros, bugs, perguntas - página 2473

 
Sergey Dzyublik:


Actualmente não é possível utilizar uma variável estática declarada dentro de uma classe modelo.
Com a introdução de um namespace, poderia esta restrição ser contornada?

Sim, pode.

O código será ligeiramente diferente, mais correcto, aqui fica um exemplo:

//+------------------------------------------------------------------+
//|                                                  ScopeSample.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class A
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=10):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class B
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=100):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
A::Item A::s_default;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
B::Item B::s_default;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(A<int>::s_default.value);
   Print(B<int>::s_default.value);
  }
//+------------------------------------------------------------------+


Resultado:

2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) A<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) B<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 10
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 100
 
Muito fixe, muito obrigado.
É possível obter acesso alfa à MT com suporte de namespace?
É realmente necessário como parte de um estudo ser capaz de escrever um "contentor inteligente", não procurar bugs/vulnerabilidades, etc.
 

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

Insectos, insectos, perguntas

Sergey Dzyublik, 2019.05.23 13:52

Tenho trabalhado com o meu corretor pela última vez, e descobri cerca de uma dúzia de bugs e "peculiaridades" em MT.
Como saber se vale a pena esperar que sejam fixados ou não?
Por favor, não sugira testar tudo cada vez que uma nova construção sai.

#(não fixado em MT5(build 2059))"Erro de compilação ao passar (vazio*)(NULL) parâmetro para a função modelo".
(fixado em MT5(build 2059)) "Strategy tester: 2 passes planeados, mas na prática um número infinito de passes > 900pc devido ao erro "OnInit critical error"".
(não fixo em MT5(build 2059))"Valor inválido do campo de tamanho de matriz dentro do operador de atribuição padrão para estruturas com matrizes dinâmicas".
(não fixado em MT5(build 2059))"O compilador não vê o construtor de cópia de classe padrão ao devolver um objecto de classe por valor de uma função".
(fixado em MT5(build 2059)) "Compiler fails to see type cast "in itself" for pattern classes e estruturas "complexas"".
(não fixo em MT5(build 2059))"Quando se trabalha com typedef, a utilização de uma função modelo com especialização explícita não gera código para esta função modelo".
#(não corrigido em MT5(build 2059))"Erro de compilação ao reutilizar a mesma assinatura de função dentro do typedef".
#
(não fixo em MT5(build 2059))"Uma parte significativa de funções para o manuseamento de cordas não funciona com caracteres NULL numa corda (por exemplo: ShortArrayToString, StringInit, StringFill)".
#(não fixo em MT5(build 2059))"A função StringSetLength apenas funciona para "aparar" o comprimento da corda, não para o aumentar.
#(fixado em MT5(build 2057))"Strategy Tester: 750 processos "metatester64.exe" estão em curso".
"Fórum www.mql5.com, ao editar uma mensagem com uma imagem, a imagem anterior não é substituída pela nova".


Sugestões:
"Permitir ao utilizador forçar a geração/apagamento de código para operador de atribuição por defeito (copy constructor)".
"Allow ArrayCopy to copy classes e estruturas "complexas", semelhantes à forma como as estruturas fornecem uma funcionalidade de cópia profunda para qualquer tipo de objecto".
"Fornecer funcionalidade para o utilizador ler/definir valor de capacidade ao trabalhar com arrays dinâmicos".

"Alterações para melhorar a infografia do serviço de Sinais"


 

Hoje, no meu terminal, o histórico do tick na minha conta real do mercado de futuros, o corretor Otkritie, não está a ser carregado.

Os dados no ticker estão a mudar.

É agora 24.05.2019 23:40

O terminal tem o último tick para 23.05.2019.


A mesma situação em alguns outros instrumentos, incluindo aqueles que eu próprio comercializei.

Num segundo terminal (configuração separada), noutra conta do mesmo corretor, o efeito é o mesmo.

 
Pode dizer se um perito está a trabalhar em modo de optimização ou em modo de teste único?
 
MT5 (construir 2059)
Erro de compilação ao passar o parâmetro (nulo*)(NULL) para a função modelo:
class C{
public:
   template<typename T>
   static void func(T ){
      Print(__FUNCSIG__);
   }
};


void OnStart(){  
   void* c_ptr = new C();
   
   C::func((C*)NULL);     // Ok
   C::func(c_ptr);        // Ok
   C::func((void*)NULL);  // 'void' - illegal use of 'void' type
   
   delete c_ptr;
}
Tudo estava a funcionar em (construir 2057), talvez algo se tenha estragado como parte da reparação:
e#"erro de compilação ao executar o tipo de elenco "em si" para classes de modelos e estruturas "complexas"".
 
Talvez por analogia com C++ faça sentido introduzir um ponteiro nullptr "de pleno direito" ?
 

De volta à construção 2056, tudo funcionou bem. Mas em 2059 já tem um erro de compilação:

void OnStart()
{
class A {};
//#define void  A //(*)
        const void *p1;
              void *p2 = (void *)p1; //Error: 'void' - class type expected
}

E se substituirmos o vazio por A (*), está tudo bem. Que diferença é que isso faz?

Além disso, ocorre um erro de compilação, mesmo neste caso:

              void *p2 = (void *)p1; //Error: 'void' - class type expected
 

Ao compilar em comando construir 2059x32 erro abstrato:

mas não se reproduz através de IDE - pode ser um acidente

 
A100:

Como escolher entre usar os modelos e anular* ?

Razão: