"MQL5 Programlama Temelleri: Dizeler" makalesi için tartışma - sayfa 2

 
denkir:

...Şahsen satır uzunluğu sınırlamaları ile ilgili soruyla ilgileniyordum....

Şimdi denedim, 32 mb sığıyor, daha da sığar ama uzun sürer.
 

According to the description of these functions in MQL5 Reference, they allow us to add up strings in a more space efficient (in terms of the occupied working memory) and faster way.

Gerçekte dokümantasyonda tutarsızlık var. Bellek kullanımını bilmiyorum, ancak daha hızlı olup olmadığı konusunda, StringConcatenate() StringAdd'den ÇOK daha yavaştır ve +

2013.04.11 19:09:48    teststring (EURUSD,M1)    time for 'StringConcatenate(c,a,b)' = 1170 milliseconds, i = 1000000
2013.04.11 19:09:47    teststring (EURUSD,M1)    time for 'StringAdd(a,b)' = 94 milliseconds, i = 1000000
2013.04.11 19:09:47    teststring (EURUSD,M1)    time for 'c = a + b' = 265 milliseconds, i = 1000000


Güzel makale, tüm yeni başlayanlar için bir zorunluluk.

[Silindi]  
Teşekkürler.
 
Güzel makale, teşekkürler.
 

bizi daha az cahil yapmak için sizi yormak güzel. çalışmalarınız için teşekkür ederim

 

Dizeye bir rakam grubu ayırıcısı ekler:

//+------------------------------------------------------------------+
//|DelimiterGroupsDigits.mq5 |
//| Telif Hakkı 2018, MetaQuotes Software Corp. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property script_show_inputs
//--- Harici parametreler
input double Value     =1000000;
input string Delimiter =" "; // Sınırlayıcı, varsayılan olarak: " ", örnek: 1 000 000.0
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart(void)
  {
   ::Print(DelimiterGroupsDigits(string(Value),Delimiter));
  }
//+------------------------------------------------------------------+
//| Rakam gruplarının ayırıcısı|
//+------------------------------------------------------------------+
string DelimiterGroupsDigits(const string value,const string delimiter=" ")
  {
   string res=value;
   string elements[];
//--- Kenarlardaki fazladan karakterleri kaldırın.
   ::StringTrimLeft(res);
   ::StringTrimRight(res);
//--- Gerçek bir sayı olup olmadığını kontrol edin
   ushort sep   =::StringGetCharacter(".",0);
   int    total =::StringSplit(res,sep,elements);
//--- Dizeyi aldım
   if(total>0)
     {
      string str[];
      int length=::StringLen(elements[0]);
      for(int k=0,i=length-1; i>=0; i--)
        {
         int size=::ArraySize(str);
         ::ArrayResize(str,size+1);
         str[size]=::StringSubstr(elements[0],i,1);
         k++;
         //--- Bir ayırıcı ekleyin
         if(k>=3 && i>0)
           {
            int array_size=::ArraySize(str);
            ::ArrayResize(str,array_size+1);
            str[array_size]=delimiter;
            k=0;
           }
        }
      //--- Dizeyi topla
      res="";
      int elements_total=::ArraySize(str);
      for(int i=elements_total-1; i>=0; i--)
         ::StringAdd(res,str[i]);
      //--- Eğer gerçek sayı ise
      if(total>1)
         ::StringAdd(res,"."+elements[1]);
     }
//--- Sonucu döndür
   return(res);
  }
//+------------------------------------------------------------------+

//---

Sonuç:

1 000 000.0
10,000,000.0
100'000'000.0
10 000.545
 
Anatoli Kazharski:

Bir dizeye rakam grubu ayırıcısı ekler:

Bir şekilde karmaşık.
 
fxsaber:
Biraz karışık.
Optimize etmeye çalışacak mısın?
 
Anatoli Kazharski:
Optimize etmeye çalışacak mısınız?
string ModToString( ulong &Num, const int Mod = 1000, const int Len = 3 )
{
  const string Res = ((bool)(Num / Mod) ? IntegerToString(Num % Mod, Len, '0') : (string)(Num % Mod));
  
  Num /= Mod;
  
  return(Res);
}

string NumToString( ulong Num, const string Delimeter = " " )
{
  string Res = ModToString(Num);

  while (Num)
    Res = ModToString(Num) + Delimeter + Res;

  return(Res);
}

string NumToString( double Num, const int digits = 8, const string Delimeter = NULL )
{
  const string PostFix = (Num < 0) ? "-" : NULL;
  
  Num = MathAbs(Num);
    
  return(PostFix + NumToString((ulong)Num, Delimeter) + StringSubstr(DoubleToString(Num - (long)Num, digits), 1));
}

void OnStart()
{
  Print(NumToString(1234567.89, 2, " "));
}
 
fxsaber:

Bu harika! Ve dört kat daha hızlı:

void OnStart(void)
  {
   long count=10000000;
   uint start=GetTickCount();
   for(int i=0; i<count && !IsStopped(); i++)
      DelimiterGroupsDigits(string(Value),Delimiter);

   uint end=GetTickCount()-start;
   Print("01 > ms: ",end,"; res: ",DelimiterGroupsDigits(string(Value),Delimiter));
//---
   start=GetTickCount();
   for(int i=0; i<count && !IsStopped(); i++)
      NumToString(Value,2,Delimiter);

   end=GetTickCount()-start;
   Print("02 > ms: ",end,"; res: ",NumToString(Value,2,Delimiter));
  }

//---

2018.01.30 21:02:15.996 01 > ms: 19047; res: 1 000 000.0
2018.01.30 21:02:20.683 02 > ms: 4688; res: 1 000 000.00