Fehler, Irrtümer, Fragen - Seite 2646

 
Andrei Trukhanovich :

weil die Vorlage nur Typen nach Parameter ausgibt, nicht nach Ausgabewert.

Dies ist nicht korrekt.

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:

Das ist nicht richtig.

Ich danke Ihnen!

Ja, es wird funktionieren, ich habe mich in der Syntax vertan.

ZS: Jetzt funktioniert alles wie vorgesehen:

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);
  }
Base64-Serialisierung von POD-Strukturen
 
Alain Verleyen:

Das ist nicht sicher.

Nein, das ist es nicht. Sie haben die explizite Einstellung von Template-Parametertypen in der Funktion angemerkt, und ich habe über die Ausgabe gesprochen, über die explizite Einstellung hat fxsaber vor mir geantwortet. und vor Ihnen

 
Andrei Trukhanovich :

Nein, das ist richtig. Sie haben die explizite Einstellung von Template-Parametertypen in der Funktion angemerkt, und ich habe über die Ausgabe gesprochen, über die explizite Einstellung hat fxsaber vor mir geantwortet. und vor Ihnen

Sprachliche Probleme.
 

Ich konnte es weder im Forum noch in den Dokumenten finden, daher habe ich eine Frage:

1. Wie groß ist die maximale Größe der Zeichenfolge, die MQL5 speichern kann?

2. Wie groß ist die maximale Größe der Zeichenfolge, die MQL4 speichern kann?

3. wenn es eine Speicherknappheit gibt, wird diese maximale Größe reduziert (oder kein Speicher für die Zeichenfolge zugewiesen) oder wird es einen Laufzeitfehler geben?

 

Defekte:
(nicht behoben von MT5(build 2319)) Fehler in der Template-Klassen-Cache-Operation: "Sie erstellen mehrmals ein komplexes umhülltes Objekt mit dem internen Typ "C", und es stellt sich heraus, dass es ein ganz anderer Datentyp ist, vielleicht "B", vielleicht "int", was immer Sie wollen...".
(nicht behoben durch MT5(build 2319)) Fehler bei der Generierung von Template-Klassencode bei Verwendung einer internen Klasse.
(nicht behoben MT5(build 2319)) Fehler bei der Definition interner Klassen - keine Möglichkeit, explizit auf den globalen Namespace zu verweisen, wenn eine Basisklasse angegeben wird.


Vorschläge:
ref - über die Notwendigkeit, in MQL eine Funktionalität für Typdeklarationen einzuführen.
Referenz- um die Erzeugung von Standard-Kopierkonstruktoren und Zuweisungsoperatoren zu erzwingen.

 
Sergey Dzyublik:

Defekte:

Gut, dass Sie Ihre Fehlerberichte im Auge behalten. Das habe ich nicht, deshalb ist alles unwiederbringlich im Forum verloren gegangen.

Vielleicht sollten Sie einige der gleichen Hash-Datensätze zu Ihren Fehlerberichten hinzufügen, damit man sie alle auf einmal suchen kann.

 
Igor Makanu:

Ich konnte es weder im Forum noch in den Dokumenten finden, daher habe ich eine Frage:

1. Wie groß ist die maximale Größe der Zeichenfolge, die MQL5 speichern kann?

2. Wie groß ist die maximale Größe der Zeichenfolge, die MQL4 speichern kann?

3. wenn der Speicherplatz nicht ausreicht, wird die maximale Größe reduziert (oder kein Speicher für die Zeichenfolge zugewiesen), oder wird ein Laufzeitfehler auftreten?

versucht, einen String in MT4 zu testen

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);
        }
     }
  }
//+------------------------------------------------------------------+

Der Speicher leckt langsam (5.1 von 11.9), in MT4 im Log:

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


Im Allgemeinen können Sie für sinnvolle Aufgaben eine große Zeichenkette verwenden, vielleicht werde ich die Datei später durch eine Zeichenkette kopieren, um sie zu überprüfen

UPD:uchar u_arr[102400]; durch uchar u_arr[524224]; ersetzt , um den Prozess zu beschleun igen

Fazit: In MT4 ist das ungefähre Maximum, das in einen String gesetzt werden kann:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: kein Speicherplatz vorhanden

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


d.h. etwa 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)

d.h. etwa 1GB
 
Igor Makanu :

versucht, String in MT4 zu testen

Der Speicher leckt ein wenig im Win Manager (5.1 von 11.9), im MT4 im Log:

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


Im Allgemeinen können Sie für sinnvolle Aufgaben eine große Zeichenkette verwenden, vielleicht werde ich die Datei später durch eine Zeichenkette kopieren, um sie zu überprüfen

UPD: uchar u_arr[ 102400 ]; durch uchar u_arr[524224]; ersetzt , um den Prozess zu beschleun igen

Fazit: In MT4 ist das ungefähre Maximum, das in einen String gesetzt werden kann:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: kein Speicherplatz vorhanden

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


d.h. etwa 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)

d.h. etwa 1GB

Dies ist die Länge der Zeichenkette für Unicode, d. h. sie ist in MB mindestens doppelt so groß. 1,3 GB für MT4, was sinnvoll ist, da Sie einen kontinuierlichen Speicherpuffer benötigen und MT4 eine 32-Bit-Anwendung ist. Die mql4-Beschränkung ist also keine Beschränkung an sich, sondern wird nur durch den verfügbaren Speicher begrenzt.

Ich bin etwas überrascht, dass MT5 nicht mehr zulässt, da Sie anscheinend eine Menge Speicherplatz zur Verfügung haben. Ich werde mein Bestes auf meiner Seite versuchen.

 
Alain Verleyen:

Dies ist die Zeichenkettenlänge für Unicode, d. h. in MB ist sie mindestens doppelt so lang. 1,3 GB für MT4, was sinnvoll ist, da Sie einen kontinuierlichen Speicherpuffer benötigen und MT4 eine 32-Bit-Anwendung ist. Die Begrenzung von mql4 selbst ist also keine Begrenzung, sie wird nur durch den verfügbaren Speicher begrenzt.

Ich bin etwas überrascht, dass MT5 nicht mehr zulässt, da Sie anscheinend eine Menge Speicherplatz zur Verfügung haben. Ich werde mein Bestes auf meiner Seite versuchen.

ich habe 12gb Arbeitsspeicher, Windows 10, freier Speicher ca. 8gb


ich brauchte diesen Test, um die maximal erlaubten Zeilenlängen in mt4/ mt5 Terminals herauszufinden

Ich möchte nun zwischen den Terminals über die Redis-Datenbank austauschen

Redis ist eine sehr einfache Datenbank und arbeitet nur mit Strings (Schlüssel - Wert --> strin - string)

Gestern habe ich POD-Strukturen in Base64 serialisiert und es erhöht die Datengröße um etwa 1/3

Ich denke, dass ich sogar in diesem Fall die Möglichkeit habe, Strukturen mit einer Größe von 400 Mb pro Transaktion auszutauschen - das ist mehr als genug für jeden Zweck! ;)