Erros, bugs, perguntas - página 1982

 
fxsaber:

O operador de cópia predefinido é accionado.

Se não for difícil, onde posso lê-lo?

 

Pode dizer-me como ler informação de um e-mail ou sms usando MQL4/5? Por exemplo, recebo um sinal de informação por e-mail, o meu Conselheiro Especialista lê-o e abre/fecha a posição.

 
fxsaber:

O operador de cópia predefinido é accionado.

Até encontrei isto nos documentos (note-se a 3ª linha a partir do fundo):

https://www.mql5.com/ru/docs/basis/types/casting

class CBar { };
class CFoo : public CBar { };
 
void OnStart()
  {
   CBar bar;    
//--- динамическое приведение типа указателя *bar к указателю *foo разрешено 
   CFoo *foo = dynamic_cast<CFoo *>(&bar); // критической ошибки выполнения не возникнет   
   Print(foo);                             // foo=NULL      
//--- попытка явного приведения ссылки объекта типа Bar к объекту типа Foo запрещено
   foo=(CFoo *)&bar;                       // возникнет критическая ошибка выполнения
   Print(foo);                             // эта строка не будет выполнена
  }

Lembro-me que era possível copiar (em estilo memcpia) para estruturas simples, mas a minha estrutura não é simples.

 
pavlick_:

Lembro-me que era possível copiar (estilo memcpy burro) em estruturas simples, mas não tenho uma estrutura simples.

A MQL5 mudou.

 
fxsaber:

A MQL5 mudou.

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

A nova versão do MetaTrader 5 build 1640: Crie e teste os seus próprios instrumentos financeiros

MetaQuotes Software Corp., 2017.07.19 18:03

Nova versão da plataforma MetaTrader 5 construída em 1640: criar e testar os seus próprios instrumentos financeiros

  1. MQL5: Adicionada geração automática de operador de cópias implícitas para objectos de estruturas e classes. Agora o compilador gera automaticamente operadores de cópia, o que permite escrever registos simples para objectos como b=a:
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- конструктор по умолчанию
                         Foo(void){value=-1;};
       //--- конструктор с параметрами   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  структура, содержащая объекты типа Foo                          |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Результат выполнения;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    O operador implícito copia os objectos de cor.

    • Se um membro for um objecto, o operador de cópia correspondente a este objecto é chamado.
    • Se o membro for um conjunto de objectos, antes de chamar o operador de cópia apropriado para cada elemento, o conjunto receptor é aumentado ou reduzido para o tamanho requerido através do ArrayResize.
    • Se um membro é um conjunto de tipos simples, a função ArrayCopy é utilizada para copiar.
    • Se um membro é um ponteiro para um objecto, o próprio ponteiro é copiado, não o objecto para o qual aponta.

    Se necessário, pode anular o comportamento e criar a sua própria variante em vez do operador da cópia implícita utilizando a sobrecarga.
 

fxsaber

Obrigado, isso agora faz sentido. Não sei se devo ou não regozijar-me. A compatibilidade com o código antigo é quebrada. É uma boa ideia forçar de alguma forma a activação de novas funcionalidades com alterações tão significativas (através de interruptores de compilação ou #pragma).


Por exemplo, o meu auto_ptr:

template <typename T_>
class auto_ptr
{
public:
   T_ *p;
   void reset()  {if(this.p) delete this.p; this.p=NULL;}
   auto_ptr(void *ptr=NULL): p(ptr)  {}
   ~auto_ptr()  {this.reset();}
   void swap(auto_ptr<T_> &other)
   {
      T_ *buf = this.p;
      this.p = other.p;
      other.p = buf;
   }
};

Agora acontece que o auto_ptr pode ser copiado no novo código (a menos que o operador/construtor copiador seja silenciado), o que levará a múltiplas supressões de um único ponteiro.

 
 

Arquivo MQL5\IncluirMqh

int MaxValue(void) const { return(m_min_value); }

 

Como descarregar o MT4?
Descarrego o ficheiro mt4setup.exe, instalo-o, mas a plataforma instala o mt5. onde posso obter o mt4?

 
lukyF: Como é que consigo MT4?

Descarrego o ficheiro mt4setup.exe, instalo-o, mas a plataforma instala o mt5. onde posso obter o mt4?

Pode descarregar o mt4 a partir do seu corretor. Esta questão surge todas as semanas...