Teste CGraphic - perguntas e sugestões - página 10

 

Fórum sobre Comércio, Sistemas Automatizados de Comércio e Testes de Estratégia

FAQ de Iniciantes MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2019.02.17 06:56

Decidi repetir o experimento novamente, aqui está o código

      //--- отключим показ ценового графика
      ChartSetInteger(0,CHART_SHOW,false);
      long chart=ChartID();

      CGraphic graphic;
         Print("0 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
      if(ObjectFind(chart,name)<0)
        {
         Print("1 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
         graphic.Create(chart,name,0,0,0,pix_X,pix_Y);//Создает графический ресурс, привязанный к объекту чарта 
         Print("2 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
        }

E aqui está o resultado

2019.02.17 08:55:19.845 Test_4G_CB (Si Splice,H1)       0 Тут ошибка 0 Операция выполнена успешно
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       1 Тут ошибка 4202 Графический объект не найден
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       2 Тут ошибка 4202 Графический объект не найден
Alguma idéia do que causou o erro?
Fui informado de que o erro está na biblioteca - ele será corrigido?
 
Aleksey Vyazmikin:
Fui informado de que há um erro na biblioteca - será que ele será corrigido?

Os telepatas estão de férias. E para as pessoas comuns, precisamos:

  1. código mínimo (do qual todo lixo desnecessário foi jogado fora) que reproduz o problema.
  2. uma descrição clara do que está errado (o que você quer obter, o que você obtém e por que você acha que é um bug)
  3. especificações do sistema operacional, construção do terminal, nome do servidor comercial

 
Aleksey Vyazmikin:
Fui informado de que há um erro na biblioteca - será que ele será corrigido?

Onde foi dito que houve um erro? Eu lhe disse - procure o ponto na biblioteca onde ele pode estar escrito na variável _LastError. Não é necessariamente que o código com o erro tenha funcionado. Porque pode procurar por um objeto (e se ele estiver ausente, o código de erro será escrito na variável) e criá-lo. Mas se o objeto não for criado, então é um erro, mas ele será criado e tudo dará certo. Mas após a verificação, o código de erro (o objeto estava ausente antes da criação) será escrito em uma variável, que você então lerá em seu código.

 
Vladimir Karputov:

Os telepatas estão de férias. O que é necessário para as pessoas comuns é:

  1. código mínimo (do qual todo lixo desnecessário foi jogado fora) que reproduz o problema.
  2. uma descrição clara do que está errado (o que você queria obter, o que você conseguiu no final e por que você acha que é um erro)
  3. especificações do sistema operacional, construção do terminal, nome do servidor comercial

1. Código

//+------------------------------------------------------------------+
//|                                              CB_Model_Analiz.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string name="Name";
   long chart=ChartID();

   CGraphic graphic;
   Print("0 Тут ошибка ",GetLastError());
   ResetLastError();
   if(ObjectFind(chart,name)<0)
     {
      Print("1 Тут ошибка ",GetLastError());
      ResetLastError();
      graphic.Create(chart,name,0,0,0,100,100);//Создает графический ресурс, привязанный к объекту чарта 
      Print("2 Тут ошибка ",GetLastError());
      ResetLastError();
     }
   graphic.Destroy();
  }
//+------------------------------------------------------------------+

2. Nenhuma expectativa de mensagens de erro no log

2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  1 Тут ошибка 4202
2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  2 Тут ошибка 4202

3. Windows 7 Home 32 bit, construído em 1940, não conectado ao servidor durante os testes - corretor Discovery.

 
Artyom Trishkin:

Onde você foi informado de que há um erro? Eu lhe disse - procure um fragmento na biblioteca onde ele possa estar escrito na variável _LastError. Não é necessariamente que o código com o erro tenha funcionado. Porque pode procurar por um objeto (e se ele estiver ausente, o código de erro será escrito na variável) e criá-lo. Mas se o objeto não for criado, é um erro, mas será criado e tudo vai dar certo. Mas após a verificação, o código de erro (o objeto estava ausente antes da criação) será escrito em uma variável, que você então lerá em seu código.

A biblioteca deve produzir um erro quando há um erro real, ou lidar corretamente com a situação e não produzir um erro onde não há nenhum. Se o meu uso da biblioteca não estiver descrito na classe ao verificar a existência de erros, você deve especificá-lo. De qualquer forma, não é razoável para o usuário editar as bibliotecas do fabricante do produto.

 
Aleksey Vyazmikin:

A biblioteca deve produzir um erro quando há um erro real, ou lidar corretamente com a situação e não produzir um erro onde não há nenhum. Se o meu uso da biblioteca não estiver descrito na classe ao verificar a existência de erros, você deve especificá-lo. De qualquer forma, não é razoável para o usuário editar as bibliotecas do fabricante do produto.

Não há erro aí, leia novamente:

Onde você foi informado de que havia um erro? Eu lhe disse - procure um fragmento na biblioteca onde ele possa estar escrito na variável _LastError. Não é necessariamente que o código com o erro tenha funcionado. Porque pode procurar por um objeto (e se ele estiver ausente, o código de erro será escrito na variável) e criá-lo. Mas se o objeto não for criado, então é um erro, mas ele será criado e tudo dará certo. Mas depois de verificar o código de erro (o objeto estava ausente antes da criação) será escrito em uma variável que você então lerá em seu código.

Portanto, é apenas seu interesse saber porque você leu o erro após a execução normal do código. O que você não entende é que a presença de código diferente de zero na variável _LastError não significa necessariamente que há um erro no código da CGraphic e não apenas nele. Neste caso, poderia ser um simples resultado da busca pela existência de um objeto, que foi executado dentro da CGraphic em SB. Houve um pedido de um objeto pelo nome, o resultado retornou -1 e o código 4202 foi escrito em _LastError. Então o objeto foi criado, tudo funcionou e foi devolvido ao programa de chamada. E lá você lê imediatamente o código de erro e o obtém. Mas não há erro - você vê o resultado de consultas dentro da SB.

Estou apenas sugerindo uma possível razão para o que você está relatando.

Portanto, se você realmente quer encontrar um erro real e relatá-lo, você precisa passar por todo o código CGráfico no depurador e pegar o erro real que levará a falhas lógicas e de desempenho, em vez de apenas afirmar que você leu o código de erro e, portanto - ele está definitivamente lá.

 
Artyom Trishkin:

Não há erro aí, leia novamente:

Portanto - é apenas seu interesse saber porque você está lendo o erro após a execução normal do código. Você provavelmente não entende que o conteúdo da variável _LastError, que não é zero, não significa necessariamente que exista um erro no código CGráfico, e não apenas nele. Neste caso, poderia ser um simples resultado da busca pela existência de um objeto, que foi executado dentro da CGraphic em SB. Houve um pedido de um objeto pelo nome, o resultado retornou -1 e o código 4202 foi escrito em _LastError. Então o objeto foi criado, tudo funcionou e foi devolvido ao programa de chamada. E lá você lê imediatamente o código de erro e o obtém. Mas não há erro algum - você vê o resultado de consultas dentro da SB.

Estou apenas sugerindo uma possível razão para o que você está relatando.

Portanto, se você realmente quer encontrar o erro real e relatá-lo, então você precisa passar por todo o código CGráfico no depurador e pegar o erro real que fará com que a lógica e a operação falhem, ao invés de apenas alegar que você leu o código de erro e, portanto - ele está definitivamente lá.

Você mesmo disse em seu raciocínio lógico que poderia haver um erro no código, e este se expressa em não reiniciar o erro. que foi recebido devido à falta de um objeto antes de ser criado.

Não, eu não tenho competência para procurar um erro em código complexo e depois obter uma resposta de que foi pretendido dessa forma.

Você pode me dizer se esta mensagem é ou não um erro do usuário?

2019.02.17 11:08:42.901 Test_4G_CB (Si Splice,H1)       invalid pointer access in 'Test_4G_CB.mq5' (909,7)

O código que aponta para isso éD.PointsFill(falso);

      CCurve *D=graphicT.CurveAdd(X_04,Y_04,ColorToARGB(DarkOrange,256),CURVE_POINTS,Interval_04);//Создает и добавляет кривую на график
      D.PointsFill(false);//Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
      D.PointsType(POINT_VERTICAL_DASH);//Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
 
Aleksey Vyazmikin:

Você mesmo indicou em seu raciocínio lógico que pode haver um erro no código, e ele é expresso por não redefinir o erro. que foi recebido devido à ausência do objeto antes de ele ter sido criado.

Não, eu não tenho competência para procurar um erro em código complexo e depois obter uma resposta de que foi pretendido dessa forma.

Você pode me dizer se esta mensagem é ou não um erro do usuário?

Ele aponta para este código -D.PointsFill(falso);

Não entendo o significado da frase de forma alguma.

Parece-me que já lhe descrevi tudo em detalhes.

Eu não sei. Não há muita informação.

 
Artyom Trishkin:

Não entendo o significado da frase de forma alguma.

Parece-me que já lhe expliquei tudo em detalhes.

Eu não sei. Não há muita informação.

Você não entende que se seu código é construído para reagir a um erro (nós criamos um objeto em caso de erro), então após corrigir o erro(criar um objeto) é lógico reiniciar este erro, o que, de acordo com seu raciocínio lógico, não é feito na biblioteca.

Aqui também não tenho informações de como reagir a este erro...

 
Aleksey Vyazmikin:

Você não entende que se o código é construído sobre a resposta ao erro (em caso de erro, criamos um objeto), então após a correção do erro(criação do objeto), é lógico reiniciar este erro, o que, de acordo com seu raciocínio lógico, não é feito na biblioteca.

Aqui não tenho informações sobre como reagir a este erro...

Você deve estar bem ciente de que não é o código em _LastError que não é igual a zero que é um erro, mas o resultado retornado pela função que aponta para uma execução errônea desta função. E _LastError contém código que aponta exatamente para aquele erro que faz com que a função seja executada por engano. Portanto, é duvidoso que você possa usar a descrição do código de erro armazenado na variável de serviço em vez de usar diretamente o código de retorno da função. Se a função retornada -1 ou falsa ou 0 (para cada função seu código de erro é descrito na ajuda), bem - somente a análise do resultado retornado pela função deve ser tratada por você, não o código em _LastError, que não indica o erro, mas é usado para indicar a causa do retorno de algum resultado retornado pela função.

A função de busca de objeto retorna um valor menor que zero no caso de um objeto com o nome dado não existir. É um erro? Não. Esta é uma resposta regular da função, com base na qual você toma uma decisão sobre a criação de um objeto com o nome dado. O código contido em _LastError diz explicitamente que "Um objeto com o nome solicitado não existe" - você pode criá-lo.

Bem, estou cansado de explicar isso para você. Quem quiser, vai entender.