Hatalar, hatalar, sorular - sayfa 2646

 
Andrei Trukhanovich :

çünkü şablon türleri çıktı değerine göre değil, yalnızca parametrelere göre çıkarır.

Bu doğru değil.

 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 :

Bu doğru değil.

Teşekkür ederim!

Evet işe yarayacak, söz diziminde kafam karıştı

Not: şimdi her şey amaçlandığı gibi çalışıyor:

 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'te POD yapılarının serileştirilmesi
 
Alain Verleyen :

Bu doğru değil.

Hayır, bu kesin. İşlev için şablon parametre türlerinin açık ayarını not ettiniz ve ben türetme hakkında konuşuyordum, fxsaber benden önce açık ayar hakkında yanıt verdi. ve sana bağlı

 
Andrei Trukhanovich :

Hayır, bu kesin. İşlev için şablon parametre türlerinin açık ayarını not ettiniz ve ben türetme hakkında konuşuyordum, fxsaber benden önce açık ayar hakkında yanıt verdi. ve sana bağlı

Dil sorunu.
 

Forumda ve dokümanlarda arama yaparak bulamadım, soru olgun:

1. MQL5'in saklayabileceği maksimum dize boyutu nedir?

2. MQL4'ün saklayabileceği maksimum dize boyutu nedir

3. Bellek sıkıntısı varsa, bu maksimum boyut küçülecek (veya dize için bellek tahsis edilmeyecek) veya bir çalışma zamanı hatası olacak mı?

 

Kusurlar:
(MT5(build 2319) tarafından düzeltilmedi ) şablon sınıfı önbelleğinin çalışmasındaki hata: "Dahili "C" tipine sahip karmaşık, çoklu sarılmış bir nesne oluşturuyorsunuz ve bunun tamamen farklı bir veri türü olduğu ortaya çıkıyor, belki "B", belki "int", ne istersen ...".
( düzeltilmemiş MT5(build 2319)) dahili sınıf kullanılırken şablon sınıfı kod oluşturma hatası.
(MT5(build 2319) tarafından düzeltilmedi ) dahili sınıf tanımlanırken oluşan hata - temel sınıf belirtilirken genel ad alanına açıkça başvurmak mümkün değildir.


Teklifler:
link - MQL typedef bildirimine işlevsellik ekleme ihtiyacı hakkında.
bağlantı - varsayılan kopya oluşturucuların ve atama operatörlerinin oluşturulmasını zorlama yeteneği sağlama hakkında.

 
Sergey Dzyublik :

Kusurlar:

Hata raporlarınızı takip etmenizde fayda var. Bunu yapmadım, çünkü forumdaki her şey geri dönüşü olmayan bir şekilde kayboldu.

Muhtemelen, bir arama ile hepsini bir kerede bulabilmeniz için hata raporlarınızla birlikte gönderilere bir ve aynı karma girişi eklemeniz gerekir.

 
Igor Makanu :

Forumda ve dokümanlarda arama yaparak bulamadım, soru olgun:

1. MQL5'in saklayabileceği maksimum dize boyutu nedir?

2. MQL4'ün saklayabileceği maksimum dize boyutu nedir

3. Bellek sıkıntısı varsa, bu maksimum boyut küçülecek (veya dize için bellek tahsis edilmeyecek) veya bir çalışma zamanı hatası olacak mı?

dizeyi MT4'te test etmeye çalıştı

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

Vin yöneticisinde, bellek çok fazla akmıyor (11.9 üzerinden 5.1), günlükte MT4'te:

StringLen = 221696000 , m_fiziksel = 12157, m_toplam = 4095, m_available = 3365, m_used = 729


genel olarak, makul görevler için büyük dizeler kullanabilirsiniz, belki biraz sonra dosyayı dize yoluyla kopyalayıp kontrol edeceğim

UPD: değiştirildi uchar u_arr[ 102400 ]; uchar için u_arr[524224]; süreci hızlandırmak için

toplam: MT4'te dizeye yerleştirilebilecek yaklaşık maksimum değer:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: bellek yetersiz

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


onlar. yaklaşık 640 MB

Not: MT5

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

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) 'tst_string.mq5' dosyasında bellek yetersiz (41,12)

onlar. yaklaşık 1GB
 
Igor Makanu :

dizeyi MT4'te test etmeye çalıştı

Vin yöneticisinde, bellek çok fazla akmıyor (11.9 üzerinden 5.1), günlükte MT4'te:

StringLen = 221696000 , m_fiziksel = 12157, m_toplam = 4095, m_available = 3365, m_used = 729


genel olarak, makul görevler için büyük dizeler kullanabilirsiniz, belki biraz sonra dosyayı dize yoluyla kopyalayıp kontrol edeceğim

UPD: değiştirildi uchar u_arr[ 102400 ]; uchar için u_arr[524224]; süreci hızlandırmak için

toplam: MT4'te dizeye yerleştirilebilecek yaklaşık maksimum değer:

2020.02.13 21:11:24.177 tst_string EURUSD,H1: bellek yetersiz

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


onlar. yaklaşık 640 MB

Not: MT5

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

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) 'tst_string.mq5' dosyasında bellek yetersiz (41,12)

onlar. yaklaşık 1GB

Bu , Unicode için dize uzunluğudur , bu nedenle MB olarak en az iki katıdır. MT4 için 1,3 GB, bu mantıklı çünkü bitişik bir bellek arabelleğine ihtiyacınız var ve MT4 32 bitlik bir uygulamadır. Dolayısıyla mql4 limitinin kendisi bir limit değildir, sadece mevcut hafıza ile sınırlıdır.

MT5'in çok fazla kullanılabilir belleğiniz olduğu için daha fazlasına izin vermemesine biraz şaşırdım. Elimden geleni yapacağım.

 
Alain Verleyen :

Bu , Unicode için dize uzunluğudur , bu nedenle MB olarak en az iki katıdır. MT4 için 1,3 GB, bu mantıklı çünkü bitişik bir bellek arabelleğine ihtiyacınız var ve MT4 32 bitlik bir uygulamadır. Dolayısıyla mql4 limitinin kendisi bir limit değildir, sadece mevcut hafıza ile sınırlıdır.

MT5'in çok fazla belleğiniz olduğu için daha fazlasına izin vermemesine biraz şaşırdım. Elimden geleni yapacağım.

12 GB belleğim var, Windows 10 işletim sistemi, boş bellek yaklaşık 8 GB


MT4/MT5 terminallerinde izin verilen maksimum hat uzunluklarını belirlemek için bu teste ihtiyacım vardı.

Şimdi Redis veritabanı aracılığıyla terminaller arasında bir değişim kurmak istiyorum

Redis çok basit bir veritabanıdır ve yalnızca dizelerle çalışır (anahtar - değer -> dize - dize)

dün Base64'te POD yapılarının serileştirmesini yaptım, veri boyutu yaklaşık 1/3 artarken

Bu durumda bile, işlem başına 400 MB büyüklüğünde yapı alışverişi yapabileceğime inanıyorum - bu herhangi bir amaç için fazlasıyla yeterli! ;)