Erros, bugs, perguntas - página 1576

 

Que princípio será usado para colocar produtos nesta faixa?

e os produtos de vendedores autorizados vão para lá? Posso ver o meu produto neste banner? folheei 30 páginas e não vi o meu...

 
Renat Fatkhullin:

Eu não interfiro. Tenho 26 anos de programação non-stop sob o meu cinto.

Os avisos são essencialmente erros se estamos a falar do sector financeiro. E todos os milhares de relatos de "perda de sinal, perda de precisão, perda em fantasmas, etc." são veredictos sobre a qualidade do código. Aparentemente, não se compreende bem as implicações.

Por favor forneça de forma suficientemente completa o pedaço de código que o compilador apontou como um erro.

Sem ela, toda esta discussão parece desagradável e injusta.

Ok, Renat, estes argumentos sobre a "qualidade do código" são irrelevantes para o tópico de discussão. Pois estamos aqui apenas a falar de compilabilidade, ou seja, a exequibilidade do código. E a perda de precisão, etc. - este é um assunto pessoal do programador, por assim dizer, da sua responsabilidade. A conversão implícita, por exemplo, int para short não é proibida pelo padrão linguístico, certo? Então porque é que estamos a pregar agora?

OK, encontrei um destes insectos:

class CClass
{

};


class CArr
{
  CClass* data[];
 public: 
  CClass* operator[] (int i)  { return data[i]; }
};


template<typename T>
void Func (T* obj)      {  }
 

void OnStart()
{  
  CArr arr;
  Func(arr[0]);
}

que eu recebo no diário de bordo:

CClass' - declaração sem tipo TestScript.mq5 16 9
CClass' - vírgula prevista TestScript.mq5 16 9

Em construções anteriores, tudo estava bem.

 
Alexey Navoykov:

OK, Renat, estes argumentos sobre a "qualidade do código" são irrelevantes para o tópico de discussão. Pois estamos apenas a falar de compilabilidade, ou seja, a exequibilidade do código aqui. E a perda de precisão, etc. - este é um assunto pessoal do programador, por assim dizer, da sua responsabilidade. A conversão implícita, por exemplo, int para short não é proibida pelo padrão linguístico, certo? Então porque é que estamos a pregar agora?

2600 lugares potencialmente problemáticos, e mesmo nas finanças - isto não é uma moral, mas exactamente o indicador da qualidade do código.


OK, encontrei um destes insectos:

que eu recebo no diário de bordo:

Em construções anteriores, tudo estava bem.

Sim, este bug já foi discutido (provavelmente, com A100) e corrigido a 4 de Maio. Excedeu-o com o controlo de tipo, aparentemente.

Anexei o último MetaEditor build 1329, que não tem este erro. Por favor, verifique lá.

O lançamento do MT5 terá lugar no dia 12 de Maio.

Arquivos anexados:
 
Alexey Navoykov:

Estava bem em construções anteriores.

No seu código, não está a devolver um ponto constante a um objecto privado. Acontece que funções de terceiros (em termos de visibilidade variável) podem mudar aparentemente algo que não deveria ser arquitectonicamente acessível a eles, uma vez que o programador especificou privado.

Sempre que quero devolver um ponteiro a um objecto privado, especifico necessariamente um modificador constante. No vosso caso, eu colocaria uma deformação.

Não sou uma ave que voa alto, por isso estou a pedir. Tem de usar este código algures ou é apenas preguiçoso definir const?

 
A100:

Dois dias desperdiçados praticamente o tempo todo (na minha idade já é muito), e eu tinha planeado usá-los de uma forma ligeiramente diferente.

Citou mais de uma centena de insectos. Cada vez que uma quantidade tão selvagem do seu tempo?! Onde obteve tal generosidade para com os criadores?
Alexey Navoykov:

Por isso, mais uma vez, tiro o meu chapéu à A100 pela sua paciência. Eu próprio estou cansado, é mais fácil para mim sentar-me na velha construção, que funciona bem, do que procurar causas de insectos na nova construção, trabalhando no balcão de serviço. Ou alguém me pagará por este trabalho?

Sim, o servicedesk é uma coisa fixe para os testadores terceiros fazerem de graça. Obviamente que não foi feito para isso, mas na realidade tornou-se exactamente o empregador de terceiros testadores que trabalham gratuitamente. Se não fossem estes relatórios de erros, o compilador teria demorado muito mais tempo a compilar.

Todos argumentarão que deve haver retribuição por encontrar um insecto, como é prática corrente no mundo. O A100 deve receber o salário do provador estatal. E, aparentemente, um ano de salário de testador.

 
Renat Fatkhullin:

Sim, este erro já foi discutido (talvez com A100) e corrigido já no dia 4 de Maio. Têm um controlo de tipo exagerado, aparentemente.

Anexei o último MetaEditor build 1329 que não contém este erro. Por favor, verifique lá.

O lançamento do MT5 será no dia 12 de Maio.

Verificado. Agora quase não há erros de compilação, excepto por algumas estranhas maravilhas que não posso reproduzir separadamente do programa, mas que consigo contornar por alguns meios aleatórios.

Mais uma vez, compila bem separadamente, mas gera um erro no meu programa.

class CBase
{
};


class CClass : public CBase
{
};

 

class CWork
{
 public:
 
  template<typename T>
  void Run(T& arr[])
  {
    struct Struct
    {
      template<typename T1> static void Set(T1& main,  T& arr[], CBase& obj)   { main.Set(arr); } 
    };
    
    Struct structobj;
    
    structobj.Set(this, arr, arr[0]);
  }

  
  template<typename T>
  void Set(T& arr[]) 
  {  
    for (int i=0; i<ArraySize(arr); i++) Set(arr[i]);  // Здесь возникает ошибка: 'arr' - parameter conversion not allowed
  }
  
  template<typename T>
  void Set(T& obj)    { } 
  
  template<typename T>
  void Set(T*& obj)    { } 

};
 
 

void Main()
{
  CWork work;
  CClass arr[];
  work.Run(arr);

  return;
}

Se acrescentar uma linha na função principal em qualquer lugar (por exemplo, após o retorno):

trabalho.set(arr[0]);

compila normalmente.

O programador parece ter ido demasiado longe na optimização.

E também há algumas falhas no tempo de execução. Por exemplo, atribuo um valor a algum membro de uma estrutura, mas mais tarde verifica-se que o valor lá é antigo, ou seja, nada foi atribuído. Se eu acrescentar uma linha com alguma operação arbitrária perto dela, tudo se torna normal. Estes bugs começaram desde aquela construção de Outono, quando se optimizou o compilador. No fim de contas, tudo ainda está cru.

Além disso, a compilação em si ainda demora 20 segundos, enquanto a compilação 1159 demorou apenas 1-2 segundos. Ao mesmo tempo, não notei qualquer aceleração significativa dos meus programas, o ganho está dentro de 10-20%. Assim pode esquecer essas histórias sobre a velocidade de 2-10x. Pode acontecer com amostras de teste especialmente seleccionadas, mas temos aplicações reais, não falsas.

Ao todo, uma compilação 10-20 vezes mais lenta para um desempenho um pouco mais elevado. Imho, não vale a pena. O tempo perdido pelo programador é muito mais valioso.

Ainda sou obrigado a ficar na construção de 1159.

 
Anton Zverev:

No seu código, não está a devolver um ponto constante a um objecto privado. Acontece que funções de terceiros (em termos de visibilidade variável) podem mudar aparentemente algo que não deveria ser arquitectonicamente acessível a eles, uma vez que o programador especificou privado.

Sempre que quero devolver um ponteiro a um objecto privado, especifico necessariamente um modificador constante. No vosso caso, colocaria uma deformação.

Não sou um grande piloto, por isso estou a pedir. Tem de usar este código algures ou é apenas preguiçoso definir const?

Só escondo uma matriz em privado enquanto os próprios objectos CClass estão disponíveis para um utilizador para acesso total, é esse o objectivo. Se eu precisasse apenas para ler, colocaria const.

 
Anton Zverev:
Todos apoiarão que deve haver retribuição por encontrar um insecto, como é prática corrente no mundo. O A100 deve receber o salário de um provador estatal. E, aparentemente, um ano de salário de testador.
Eu apoio isso, mas receio que se limite a uma placa e a uma carta de recomendação :)
 

Não sei se isto é um bug ou apenas uma descrição errada dos métodos CDealInfoPositionId() eTicket(). Escrevi o seguinte código

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

resultado

NM      0       14:06:49.083    test_01 (EURUSD,H1)     ResultDeal() = 69380150
QE      0       14:06:49.083    test_01 (EURUSD,H1)     deal.PositionId() = 0

Acrescentei um pedido de histórico de negócios utilizando a funçãoHistorySelect().

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   HistorySelect(0,TimeCurrent());
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

resultado

JM      0       14:16:33.055    test_01 (EURUSD,H1)     ResultDeal() = 69381116
EF      0       14:16:33.055    test_01 (EURUSD,H1)     deal.PositionId() = 83654708
 
Alexey Navoykov:

Em privado apenas escondo a matriz. E os próprios objectos CClass estão à disposição do utilizador para acesso total, é esse o objectivo. Se fosse necessário apenas para leitura, eu colocaria const.

Estou a ver. Pode dizer-me em que construções isto pode ser útil? Compreendo que com esta abordagem, não se pode fazer nada com a matriz em si (redimensionar, trocar elementos, etc.). eliminar, no entanto, pode ser aplicado...

Presumo que o faça algures com um modelo, de modo que a sintaxe do operador [] seja a mesma para diferentes tipos de objectos. Em geral, poderia mostrar a utilização desta construção quando é conveniente.