Biblioteca de classes genéricas - bugs, descrição, perguntas, recursos de uso e sugestões - página 25

 
Andrey Pogoreltsev:

Porquê criar colecções e colocá-las numa kodobase se só servem para tipos incorporados)?

Também não são bons para estruturas embutidas.

 
Andrey Pogoreltsev:

Diga-me, talvez eu não compreenda alguma coisa, mas se eu tentar usar uma construção deste tipo:

Recebo um erro:

Opção' - os objectos são passados apenas por referência ICollection.mqh 14 18

e há uma pilha cheia de erros a seguir...

Isto não funcionará, através de um modelo de modelo preciso de fazer, também trabalhei com esta questão, aqui está um exemplo de teste, parece funcionar correctamente

CData de classe - estrutura que queremos armazenar na lista

CDataBase - a própria lista

#property strict
#include <Arrays\List.mqh>

//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
   datetime          t;
  };
//+------------------------------------------------------------------+
template<typename TDB>class CDataBase
  {
private:
   CList            *mlist;
   TDB              *TDBptr;
public:
   void CDataBase()           { mlist=new CList;                                       }
   void ~CDataBase(void)      { delete mlist;                                          }
   int ArraySize(void)        { return(mlist.Total());                                 }
   TDB *operator[](int index) { return(mlist.GetNodeAtIndex(index));                   }
   void  AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return(typename(TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart()
  {

   CDataBase<CData>*data=new CDataBase<CData>;
   CData *my=new CData;

   int i;
   Print("1------------------------------------");
   for(i=0; i<10; i++)
     {
      my.x=i;
      my.y= i*2;
      data.AddValue(my);
      Print(i," : ",data[i].x," , ",data[i].y," / ",my.x," ,",my.y);
     }
   Print("2------------------------------------");
   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

Em OnStart() - criamos uma lista, escrevemos-lhe valores, e depois leio-os. Verifico 2 vezes, porque no início perdi a visibilidade de uma variável local quando escrevia na lista - costumava escrever tudo bem, mas quando lia, depois recebi apontadores nulos e um erro

 
Igor Makanu:

Não vai funcionar assim, é preciso usar modelos de modelos, eu também estava a tratar deste assunto, fiz um exemplo de teste, tudo parece funcionar correctamente

CData de classe - a estrutura que queremos armazenar na lista

CDataBase - a própria lista

Em OnStart () - criar uma lista, escrever-lhe valores e depois lê-los. Verifico duas vezes, porque primeiro perdi algures a visibilidade de uma variável local ao escrever para a lista - estava a escrever tudo bem, mas quando estava a ler, depois recebi apontadores nulos e um erro

O seu código funciona porque o CData ainda é uma classe, não uma estrutura. Se tentar utilizar o gerador para classes e estruturas de uma só vez, terá problemas, especialmente com o operador de eliminação. Estava convencido disso através das minhas próprias experiências com este "genérico". A questão é que esta biblioteca "genérica" não tem nenhum operador de eliminação e se se acrescentar uma nova classe a tal "colecção", depois de abandonar o programa haverá muitos objectos perdidos. Ou seja, é óbvio que originalmente este genérico foi escrito apenas para tipos primitivos.

 
Vasiliy Sokolov:

Este código funciona para si porque o CData é uma classe, não uma estrutura. Se tentar usar genéricos para classes e estruturas ao mesmo tempo, encontrará imediatamente problemas, especialmente com o operador de eliminação. Estava convencido disso através das minhas próprias experiências com este "genérico". A questão é que esta biblioteca "genérica" não tem nenhum operador de eliminação e se se acrescentar uma nova classe a tal "colecção", depois de abandonar o programa haverá muitos objectos perdidos. Isto é, pode-se ver que originalmente este genérico foi escrito apenas para tipos primitivos.

Deixei de usar estruturas em MQL, a estrutura não tem vantagens, mas os constantes bugs e perda de tempo ao trabalhar com as estruturas que vão fornecer - li os posts dos antigos administradores com perguntas sobre as estruturas e eles basicamente diriam usar a classe em vez da estrutura - não uso estruturas de todo agora

SZZ: Encontrei isto quando deixei de utilizar estruturashttps://www.mql5.com/ru/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev:

porquê criar colecções e colocá-las numa kodobase se só servem para tipos incorporados)?

Conveniência que vem como padrão. Por conseguinte, não há necessidade de puxar - cada utilizador tem um.

Utilizo-a numa das minhas libras KB durante muito tempo.

 
Igor Makanu:

Não vai funcionar assim, é preciso usar modelos de modelos, eu também estava a tratar deste assunto, fiz um exemplo de teste, tudo parece funcionar correctamente

CData de classe - a estrutura que queremos armazenar na lista

CDataBase - a própria lista

Em OnStart () - criar uma lista, escrever valores para ela e depois ler, 2 vezes verifico, porque no início perdi a visibilidade de uma variável local ao escrever para a lista - costumava escrever tudo bem, mas quando lia, depois recebi apontadores nulos lidos e recebi um erro

Bem, em primeiro lugar, implementou o seu alocador sobre uma lista e aí armazenou apontadores. Não é só isso, tem uma fuga quando destrói).

Em segundo lugar, deve ter utilizado correctamente o construtor de cópias em vez do operador da tarefa. Mas tudo isto é IMHO)

E o mais importante: os criadores só precisam de finalizar os genéricos, fazer alocadores no interior e suportar objectos personalizados. C++ já inventou tudo para eles) E não temos de inventar bicicletas.

 
Andrey Pogoreltsev:

Bem, antes de mais, implementou o seu alocador sobre uma lista e armazena aí as indicações. Não só isso, tem fugas de informação sobre a destruição)

Como detectou fugas de informação?

SZZ: é um exemplo de teste, tive de descobrir como trabalhar com listas em MQL, por isso fiz testes.

 
Andrey Pogoreltsev:

E o mais importante: os criadores devem apenas terminar os genéricos, fazer alocadores no interior e suportar objectos personalizados. C++ já inventou tudo para eles) E não temos de inventar bicicletas.

Escreva-o se for assim tão simples.

 
Igor Makanu:

como foram detectadas as fugas?

ZS: é um exemplo de teste, tive de descobrir como trabalhar com listas em MQL, por isso fiz testes.

Cria cópias de objectos em AddValue através de novos, mas não os liberta em destruidor, apenas limpa a lista de apontadores.

 
TheXpert:

escrever se é assim tão simples.

Quando eu tiver tempo e necessidade, escreverei. E, em geral, como exemplo, montar a sua própria fábrica de rolamentos não é uma boa ideia se precisar apenas de um modelo de rolamento)

Razão: