Errori, bug, domande - pagina 2646

 
Andrei Trukhanovich :

perché il template emette solo tipi per parametro, non per valore di uscita.

Questo non è esatto.

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:

Non è esatto.

Grazie!

Sì, funzionerà, mi sono confuso nella sintassi

ZS: ora funziona tutto come 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);
  }
serializzazione Base64 delle strutture POD
 
Alain Verleyen:

Questo non è sicuro.

No, non lo è. Hai notato l'impostazione esplicita dei tipi di parametri template nella funzione, e io stavo parlando dell'output, dell'impostazione esplicita a cui ha risposto fxsaber prima di me. e prima di te

 
Andrei Trukhanovich :

No, è vero. Hai notato l'impostazione esplicita dei tipi di parametri template nella funzione, e io stavo parlando dell'output, dell'impostazione esplicita a cui ha risposto fxsaber prima di me. e prima di te

Problema di lingua.
 

Non sono riuscito a trovarlo sul forum o nei documenti, quindi ho una domanda:

1. qual è la dimensione massima della stringa che MQL5 può memorizzare?

2. qual è la dimensione massima della stringa che MQL4 può memorizzare?

3. se c'è una carenza di memoria, questa dimensione massima sarà ridotta (o nessuna memoria allocata per la stringa) o ci sarà un errore di runtime?

 

Difetti:
(non risolto da MT5(build 2319)) bug nell'operazione di cache della classe template: "Si crea un oggetto complesso avvolto con il tipo interno "C" diverse volte, e si scopre che è un tipo di dati molto diverso, forse "B", forse "int", qualsiasi cosa si voglia...".
(non risolto da MT5(build 2319)) bug con la generazione del codice della classe template quando si usa la classe interna.
(non corretto MT5(build 2319)) bug quando si definisce una classe interna - nessuna possibilità di fare esplicitamente riferimento allo spazio dei nomi globale quando si specifica una classe base.


Suggerimenti:
ref - sulla necessità di introdurre la funzionalità delle dichiarazioni typedef in MQL.
Riferimento- per permettere di forzare la generazione di costruttori di copia e operatori di assegnazione predefiniti.

 
Sergey Dzyublik:

Difetti:

Buon per te che tieni traccia delle tue segnalazioni di bug. Non l'ho fatto, ecco perché tutto si è irrimediabilmente perso nel forum.

Forse dovresti aggiungere alcuni degli stessi record di hash ai tuoi post di segnalazione di bug, in modo da poterli cercare tutti insieme.

 
Igor Makanu:

Non sono riuscito a trovarlo sul forum o nelle banchine, quindi ho una domanda:

1. qual è la dimensione massima della stringa che MQL5 può memorizzare?

2. qual è la dimensione massima della stringa che MQL4 può memorizzare?

3. se la memoria è insufficiente, questa dimensione massima sarà ridotta (o non sarà allocata memoria per la stringa) o ci sarà un errore di runtime?

provato a testare una stringa in 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);
        }
     }
  }
//+------------------------------------------------------------------+

La memoria perde lentamente (5,1 su 11,9), in MT4 nel log:

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


in generale, per compiti ragionevoli, si può usare una grande stringa, forse più tardi copierò il file attraverso una stringa per controllare

UPD: sostituitouchar u_arr[102400]; con uchar u_arr[524224]; per accelerare il processo

In conclusione: in MT4, il massimo approssimativo che può essere messo in stringa è:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: out of memory

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


cioè circa 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) esaurito la memoria in 'tst_string.mq5' (41,12)

cioè circa 1GB
 
Igor Makanu :

provato a testare la stringa in MT4

La memoria sta perdendo un po' in Win Manager (5.1 su 11.9), in MT4 nel log:

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


in generale, per compiti ragionevoli, si può usare una grande stringa, forse più tardi copierò il file attraverso una stringa per controllare

UPD: sostituito uchar u_arr[ 102400 ]; da uchar u_arr[524224]; per accelerare il processo

In conclusione: in MT4 il massimo approssimativo che può essere messo in stringa è:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: out of memory

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


cioè circa 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) esaurito la memoria in 'tst_string.mq5' (41,12)

cioè circa 1GB

Questa è la lunghezza della stringa per Unicode, quindi in MB è almeno il doppio. 1,3 GB per MT4, il che ha senso dato che hai bisogno di un buffer di memoria continuo e MT4 è un'applicazione a 32 bit. Quindi la limitazione di mql4 non è una limitazione in sé, ma è solo limitata dalla memoria disponibile.

Sono un po' sorpreso che MT5 non permetta di più, dato che sembra che tu abbia molta memoria disponibile. Farò del mio meglio dalla mia parte.

 
Alain Verleyen:

Questa è la lunghezza della stringa per Unicode, quindi in MB è almeno il doppio. 1,3 GB per MT4, il che ha senso dato che hai bisogno di un buffer di memoria continuo e MT4 è un'applicazione a 32 bit. Quindi la limitazione di mql4 in sé non è una limitazione, è solo limitata dalla memoria disponibile.

Sono un po' sorpreso che MT5 non permetta di più, dato che sembra che tu abbia molta memoria disponibile. Farò del mio meglio dalla mia parte.

Ho 12gb di memoria, Windows 10, memoria libera circa 8gb


Avevo bisogno di questo test per scoprire la lunghezza massima consentita delle linee nei terminali mt4/ mt5

Ora voglio scambiare tra i terminali attraverso il database Redis

Redis è un database molto semplice e funziona solo con le stringhe (chiave - valore --> strin - string)

Ieri ho serializzato le strutture POD in Base64 e questo aumenta la dimensione dei dati di circa 1/3

Penso che anche in questo caso ho la possibilità di scambiare strutture con dimensioni di 400 Mb per transazione - che è più che sufficiente per qualsiasi scopo! ;)