Errori, bug, domande - pagina 2709

 
Stanislav Korotky:

Perché non posso chiamare un costruttore protetto dal mio metodo di fabbrica in MQL?

Il problema è il valore di default, se lo rimuovi, tutto funziona come dovrebbe:

class A1
{
  protected:
    A1(const bool x = false){}
  public:  
    static A1 *creator()
    {
      return new A1(true);
    }
};

void OnStart()
{
  A1 *a = A1::creator();
}
 
Stanislav Korotky:

Perché in MQL non potete chiamare un costruttore protetto dal vostro metodo di fabbrica?

Non ho indovinato dove potrebbe essere utile.

 
fxsaber:

Non ho indovinato dove questo potrebbe essere utile.

Classica implementazione del pattern Singleton.

 
Sergey Dzyublik:

Una classica implementazione del pattern Singleton.

Quindi non si può creare più di un certo numero di oggetti di una data classe?

 
fxsaber:

In modo che non si possa creare più di un certo numero di oggetti di una data classe?

Sì, in modo che ci sia un unico punto di accesso da tutte le parti del programma a un'istanza della classe con stato modificabile.
Ecco un bel sito che ho trovato oggi sui modelli in immagini e pseudocodici:https://refactoring.guru/ru/design-patterns/singleton

Одиночка
Одиночка
  • refactoring.guru
Одиночка — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Проблема Одиночка решает сразу две проблемы, нарушая принцип единственной ответственности класса. Гарантирует наличие единственного экземпляра класса. Чаще всего это полезно для...
 
Sergey Dzyublik:

Sì, per avere un unico punto di accesso da tutte le parti del programma a un'istanza di classe che cambia stato.
Ecco un bel sito che ho trovato oggi sui modelli in immagini e pseudocodici:https://refactoring.guru/ru/design-patterns/singleton

Capito, grazie. Ho già usato una costruzione simile.

template <typename T>
struct PTR
{
  T* Ptr;

  PTR( void ) : Ptr(NULL)
  {
  }

  PTR( T* ptr ) : Ptr(ptr)
  {
  }

  ~PTR( void )
  {
    if (this.Ptr)
      delete this.Ptr;
  }

  bool Set( T* ptr )
  {
    this.Ptr = ptr;

    return(true);
  }

  void operator =( bool )
  {
  }
};

class CLASS
{
private:
#define  THIS CLASS::sPtr.Ptr
  static PTR<CLASS> sPtr;

  CLASS( const bool x /* = false */ )
  {
  }
    
  static bool Set()
  {
    return(THIS ? false : CLASS::sPtr.Set(new CLASS(true)));
  }  
#undef  THIS  
};

// Создается скрытый объект CLASS со скрытым конструктором.
// Ни создать CLASS-объект, ни обратиться к существующему нельзя
static PTR<CLASS> CLASS::sPtr = CLASS::Set();
 
Sergey Dzyublik:

Il problema è con il valore di default, se lo rimuovi, tutto funziona come dovrebbe:

Ma in C++ funziona anche con il valore predefinito. Che effetto ha?

 

Qualcuno ha agganciato MQL's CryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]) con compressione deflate da websocket? L'echo-server pubblico (echo.websocket.org) non sembra supportare questa estensione, non ho trovato nessun altro echo-server e il node.js locale dà errore "zlib invalid distance too far back" quando si cerca di decifrare dati compressi. Ho impostato server_max_window_bits=15; client_max_window_bits=15 nell'intestazione, ma non sembra essere il caso poiché il server conferma queste impostazioni. Sul lato MQL non posso impostare nulla tranne la chiave {1,0,0,0} ;-(.

 
Stanislav Korotky:

Qualcuno ha agganciato MQL's CryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]) con compressione deflate da websocket? L'echo-server pubblico (echo.websocket.org) non sembra supportare questa estensione, non ho trovato nessun altro echo-server e il node.js locale dà errore "zlib invalid distance too far back" quando si cerca di decifrare dati compressi. Ho impostato server_max_window_bits=15; client_max_window_bits=15 nell'intestazione, ma non sembra essere il caso poiché il server conferma queste impostazioni. Sul lato MQL non posso impostare nulla tranne la chiave {1,0,0,0} ;-(.

Se ho capito bene la tua domanda, la compressione GZIP è usata principalmente nei websockets per il confezionamento dei dati.
La costante CRYPT_ARCH_ZIP molto probabilmente impacchetta a ZIP regolare.
Se sai come impacchettare/disimballare GZIP usando mql5, sono anche interessato.

 
Roman:

Se ho capito bene la domanda, i websockets usano principalmente la compressione GZIP per impacchettare i dati.
La costante CRYPT_ARCH_ZIP molto probabilmente impacchetta a ZIP regolare.
Se sai come impacchettare/disimballare GZIP, usando gli strumenti mql5, sono anche interessato.

Per quanto ne so, lo switch {1,0,0,0} rimuove tutti i wrapping e lascia solo il pacchetto compresso. Almeno la parola "Hello" appare in forma compressa allo stesso modo nell'output CryptEncode e nell'output deflate. Di conseguenza, dovrebbe funzionare anche il contrario. Tuttavia, MQL non dà altre impostazioni e non mostra le impostazioni "predefinite" di deflate utilizzate da esso. Ovviamente sono diversi, ma solo max_window_bits e no_context_takeover possono essere controllati nel websocket - in primo luogo sono chiaramente meno che nell'algoritmo deflate (che è configurato sul server), in secondo luogo nemmeno possono essere configurati in CryptEncode/Decode.