Errores, fallos, preguntas - página 2646

 
Andrei Trukhanovich :

porque la plantilla sólo emite tipos por parámetro, no por valor de salida.

Esto no es exacto.

struct A
  {
   int               i;
   double            d;
  };

template<typename T>
T f(int value)
  {
   T result={0};
   return(result);
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   int i = 1;
   a = f<A>(i);
  }
 
Alain Verleyen:

Eso no es exacto.

Gracias.

Sí, funcionará, se confundió en la sintaxis

ZS: ahora todo funciona como estaba previsto:

struct A
  {
   long              l;
   uint              ui;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   uchar u_arr[];
   string result = "";
   a.l  = 0xFFFFFFFFFFFFFFFF;
   a.ui = 0x0000;
//--- проверка работоспособности вывода
   StructToCharArray(a, u_arr);
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
   printf("result = %s", result);   // result = ffffffffffffffff0000

//----  
   string s = StructEncodeBase64(a);
   Print(s);
   A b;
   b = StructDecodeBase64<A>(s);

   StructToCharArray(b, u_arr);
   result="";
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
    printf("result = %s", result);

  }
//+------------------------------------------------------------------+
template<typename T>
string StructEncodeBase64(T &s_value)
  {
   const uchar key[1] = {0};
   uchar data[], result[];
   StructToCharArray(s_value, data);
   CryptEncode(CRYPT_BASE64, data, key, result);
   return(CharArrayToString(result));
  }
//+------------------------------------------------------------------+
template<typename T>
T StructDecodeBase64(string value)
  {
   const uchar key[1] = {0};
   uchar data[], decode[];
   T result;
   StringToCharArray(value, data, 0, StringLen(value));
   CryptDecode(CRYPT_BASE64, data, key, decode);
   CharArrayToStruct(result, decode);
   return(result);
  }
Serialización en Base64 de las estructuras POD
 
Alain Verleyen:

Eso no es seguro.

No, no lo es. Usted señaló la configuración explícita de los tipos de parámetros de la plantilla en la función, y yo estaba hablando de la salida, sobre la configuración explícita fxsaber respondió antes que yo. y antes de que

 
Andrei Trukhanovich :

No, es cierto. Usted señaló la configuración explícita de los tipos de parámetros de la plantilla en la función, y yo estaba hablando de la salida, sobre la configuración explícita fxsaber respondió antes que yo. y antes de que

Problema lingüístico.
 

No he podido encontrarlo en el foro ni en los documentos, así que tengo una pregunta:

1. ¿Cuál es el tamaño máximo de la cadena que puede almacenar MQL5?

2. ¿Cuál es el tamaño máximo de la cadena que puede almacenar el MQL4?

3. si hay una escasez de memoria, este tamaño máximo se reducirá (o no se asignará memoria para la cadena) o habrá un error de ejecución?

 

Defectos:
(no solucionado por MT5(build 2319)) error en la operación de caché de la clase de plantilla: "Creas un objeto complejo envuelto con el tipo interno "C" varias veces, y resulta ser un tipo de datos bastante diferente, tal vez "B", tal vez "int", lo que quieras...".
(no corregido por MT5(build 2319)) error con la generación de código de la clase de la plantilla cuando se utiliza la clase interna.
(no corregido MT5(build 2319)) error al definir la clase interna - no se puede hacer referencia explícita al espacio de nombres global al especificar una clase base.


Sugerencias:
ref - sobre la necesidad de introducir la funcionalidad de la declaración typedef en MQL.
Referencia- para permitir forzar la generación de constructores de copia y operadores de asignación por defecto.

 
Sergey Dzyublik:

Defectos:

Bien por ti por llevar un registro de tus informes de errores. No lo hice, por eso todo se perdió irremediablemente en el foro.

Tal vez deberías añadir algunos de los mismos registros de hash a tus posts de informes de errores, para poder buscarlos todos a la vez.

 
Igor Makanu:

No lo he encontrado en el foro ni en los muelles, así que tengo una pregunta:

1. ¿Cuál es el tamaño máximo de la cadena que puede almacenar MQL5?

2. ¿Cuál es el tamaño máximo de la cadena que puede almacenar el MQL4?

3. si no hay suficiente memoria, este tamaño máximo se reducirá (o no se asignará memoria para la cadena) o habrá un error de ejecución?

Intento de probar una cadena en MT4

void OnTick()
  {
   static bool frun = true;
   uchar u_arr[102400];
   if(frun)
     {
      frun = false;
      string s = "";
      while(!IsStopped())
        {
         ArrayInitialize(u_arr, uchar(rand() % 255));
         s += CharArrayToString(u_arr);
         printf("StringLen = %i , m_physical = %i, m_total = %i, m_available = %i, m_used = %i", StringLen(s), TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL), TerminalInfoInteger(TERMINAL_MEMORY_TOTAL),
                TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE), TerminalInfoInteger(TERMINAL_MEMORY_USED));
         Sleep(150);
        }
     }
  }
//+------------------------------------------------------------------+

Las fugas de memoria son lentas (5,1 de 11,9), en MT4 en el registro:

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


en general, para tareas sensibles, se puede utilizar una cadena grande, tal vez más tarde voy a copiar el archivo a través de una cadena para comprobar

UPD: sustituido uchar u_arr [102400]; por uchar u_arr[524224]; para acelerar el proceso

Conclusión: en MT4, el máximo aproximado que se puede poner en la cadena es:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: fuera de memoria

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539


es decir, unos 640 MB

SZZ: MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) out of memory in 'tst_string.mq5' (41,12)

es decir, alrededor de 1GB
 
Igor Makanu :

intentó probar la cadena en MT4

La memoria se fuga un poco en Win Manager (5,1 de 11,9), en MT4 en el registro:

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


en general, para tareas sensibles, se puede utilizar una cadena grande, tal vez más tarde voy a copiar el archivo a través de una cadena para comprobar

UPD: sustituido uchar u_arr[ 102400 ]; por uchar u_arr[524224]; para acelerar el proceso

Conclusión: en MT4 el máximo aproximado que se puede poner en cadena es:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: fuera de memoria

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539


es decir, unos 640 MB

SZZ: MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) out of memory in 'tst_string.mq5' (41,12)

es decir, alrededor de 1GB

Esta es la longitud de la cadena para Unicode, así que en MB es al menos el doble. 1,3 GB para MT4, lo que tiene sentido ya que se necesita un buffer de memoria continuo y MT4 es una aplicación de 32 bits. Así que la limitación de mql4 no es una limitación en sí misma, sino que sólo está limitada por la memoria disponible.

Me sorprende un poco que MT5 no permita más, ya que parece que tienes mucha memoria disponible. Me esforzaré al máximo por mi parte.

 
Alain Verleyen:

Esta es la longitud de la cadena para Unicode, así que en MB es al menos el doble. 1,3 GB para MT4, lo que tiene sentido ya que se necesita un buffer de memoria continuo y MT4 es una aplicación de 32 bits. Así que la limitación de mql4 en sí no es una limitación, sólo está limitada por la memoria disponible.

Me sorprende un poco que MT5 no permita más, ya que parece que tienes mucha memoria disponible. Me esforzaré al máximo por mi parte.

tengo 12gb de memoria, Windows 10 , memoria libre de unos 8gb


necesitaba esta prueba para averiguar la longitud máxima de línea permitida en los terminales mt4/ mt5

Ahora quiero intercambiar entre terminales a través de la base de datos Redis

Redis es una base de datos muy simple y sólo funciona con cadenas (clave - valor --> cadena - cadena)

Ayer he serializado estructuras POD en Base64 y aumenta el tamaño de los datos en aproximadamente 1/3

Creo que incluso en este caso tengo la posibilidad de intercambiar estructuras con un tamaño de 400 Mb por transacción - ¡eso es más que suficiente para cualquier propósito! ;)