Errores, fallos, preguntas - página 2709

 
Stanislav Korotky:

¿Por qué no puedo llamar a un constructor protegido desde mi método de fábrica en MQL?

El problema es el valor por defecto, si lo quitas, todo funciona como debería:

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

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

¿Por qué en MQL no se puede llamar a un constructor protegido desde su método de fábrica?

No he adivinado dónde puede ser útil.

 
fxsaber:

No he adivinado dónde puede ser útil.

Implementación clásica del patrón Singleton.

 
Sergey Dzyublik:

Una implementación clásica del patrón Singleton.

Entonces, ¿no se puede crear más de un determinado número de objetos de una clase determinada?

 
fxsaber:

¿Para que no se pueda crear más de un número determinado de objetos de una clase determinada?

Sí, para que haya un único punto de acceso desde todas las partes del programa a una instancia de la clase con estado cambiante.
Aquí hay un sitio genial que encontré hoy sobre patrones en imágenes y pseudocódigo:https://refactoring.guru/ru/design-patterns/singleton

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

Sí, para tener un único punto de acceso desde todas las partes del programa a una instancia de clase que cambia de estado.
Aquí hay un sitio genial que encontré hoy sobre patrones en imágenes y pseudocódigo:https://refactoring.guru/ru/design-patterns/singleton

Entendido, gracias. Ya he utilizado una construcción de este tipo.

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:

El problema está en el valor por defecto, si lo quitas, todo funciona como debería:

Pero en C++, también funciona con el valor por defecto. ¿Cómo le afecta?

 

¿Alguien ha conectado CryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]) de MQL con la compresión deflate desde websocket? El servidor de eco público (echo.websocket.org) no parece soportar esta extensión, no he encontrado ningún otro servidor de eco, y el node.js local da el error "zlib invalid distance too far back" al intentar descifrar los datos comprimidos. He puesto server_max_window_bits=15; client_max_window_bits=15 en la cabecera, pero parece que no es así ya que el servidor confirma estos ajustes. En el lado de MQL no puedo establecer nada excepto la tecla {1,0,0,0} ;-(.

 
Stanislav Korotky:

¿Alguien ha conectado CryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]) de MQL con la compresión deflate desde websocket? El servidor de eco público (echo.websocket.org) no parece soportar esta extensión, no he encontrado ningún otro servidor de eco, y el node.js local da el error "zlib invalid distance too far back" al intentar descifrar los datos comprimidos. He puesto server_max_window_bits=15; client_max_window_bits=15 en la cabecera, pero parece que no es así ya que el servidor confirma estos ajustes. En el lado de MQL no puedo establecer nada excepto la tecla {1,0,0,0} ;-(.

Si he entendido bien tu pregunta, la compresión GZIP se utiliza principalmente en los websockets para empaquetar datos.
La constante CRYPT_ARCH_ZIP probablemente empaqueta a ZIP regular.
Si sabes cómo empaquetar/desempaquetar GZIP usando mql5, también estoy interesado.

 
Roman:

Si he entendido bien la pregunta, los websockets utilizan principalmente la compresión GZIP para empaquetar los datos.
La constante CRYPT_ARCH_ZIP probablemente empaqueta a ZIP regular.
Si sabes cómo empaquetar/desempaquetar GZIP, utilizando las herramientas de mql5, también estoy interesado.

Por lo que sé, el interruptor {1,0,0,0} elimina toda la envoltura y deja sólo el paquete comprimido. Al menos la palabra "Hola" aparece en forma comprimida de la misma manera en la salida CryptEncode y en la salida deflate. En consecuencia, también debería funcionar a la inversa. Sin embargo, MQL no da más ajustes y no muestra los ajustes "por defecto" de deflate que utiliza. Obviamente son diferentes, pero sólo max_window_bits y no_context_takeover pueden ser controlados en el websocket - en primer lugar son claramente menores que en el algoritmo deflate (que se configura en el servidor), en segundo lugar incluso no pueden ser configurados en CryptEncode/Decode.

Razón de la queja: