Hatalar, hatalar, sorular - sayfa 2746

 
Koldun Zloy :

Numara. Derleme zamanında, bu henüz bilinmiyor.

O zaman SymbolInfoTick'i on milyarlarca kez ararken çok sayıda kontrolden kaçınmanın nasıl bir faydası olur?

 
fxsaber :

O zaman SymbolInfoTick'i on milyarlarca kez ararken çok sayıda kontrolden kaçınmanın nasıl bir faydası olur?

Mümkün değil. Yalnızca dizenin kendisini gereksiz yere kopyalamamaya yardımcı olur.

 
Koldun Zloy :

Mümkün değil. Yalnızca dizenin kendisini gereksiz yere kopyalamamaya yardımcı olur.

O zaman, Optimize Edici'den daha fazla verim istiyorsanız, SymbolInfo - fonksiyonları için dize referanslı çözümün doğru olduğu açıktır.

 

Projelerimden birindeki hata ayıklayıcı benim için çalışmayı reddediyor. Ayrıca, davranışını tahmin etmek zordur. Bazen sadece kesme noktalarına ulaşmayı reddediyor. Ayrıca bazı işlevlere girmeyi de reddediyor. İlk başta sebebin güncellemeler olduğunu düşündüm (birdenbire hata ayıklamada bir şeyler ters gitti). Ancak diğer daha basit programlarda her şey çalışıyor gibi görünüyor. Ana projem üzerinde çalıştığımdan beri çok detaylı kontrol etmedim. Oldukça karmaşık olduğu ortaya çıktı ve sadece tasarımımın 15 modülünü içeriyor (standart modüllerin sayısını saymadım). Ana modül 2000 satıra kadar içerir. Belki projenin karmaşıklığındandır diye düşündüm... Ayrıca, bazı yerlerde tekrarlayan kod parçacıkları için makrolar kullanıyorum. Ayrıca programımın işlevselliği için yeniden yazdığım CAppDialog, CCheckGroup, CComboBox, CButton vb. gibi standart UI öğelerini de kullanıyorum. Belki hata ayıklama onlar yüzünden çalışmıyor... Örneğin, hata ayıklama benim tarafımdan özel olarak yazılmış CCheckGroup::itemCheckState(const string item) yöntemine girmiyor. Yöntem, onay kutusu öğesini bulur ve seçili olup olmadığını kontrol eder (Durumu):

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState( const string item) {
   int total = m_strings.Total();
  
   if (total != m_states.Total())
     return - 1 ;
    
   int i = 0 ;
   for (; i < total; i++) {
     if (m_strings.At(i) == item)
       return m_states.At(i);
  }
  
   return - 1 ;
}

İşte bitirdiğim kullanıcı arayüzü:

kullanıcı arayüzü

Bazı UI öğeleri geçici olarak sınıflandırılır. Ve burada CAppDialog öğesinin Show() ve Hide() yöntemlerini nasıl geçersiz kıldığım hakkında konuştuğum başlık: https://www.mql5.com/ru/forum/338301 . Sonra derleyici yemin etti, kritik bir hata vardı.

Sonuç olarak, projenin normal bir şekilde derlendiği ortaya çıkıyor, derleyici herhangi bir hata üretmiyor. Ancak hata ayıklama sorunludur ve yalnızca bazı kod parçacıklarının, işlevlerin, yöntemlerin vb. yürütülmesini göstermez.

Anladığım kadarıyla, birkaç nedeni olabilir.

  1. Karmaşık proje kodu, makro kullanımı
  2. CAppDialog, CCheckGroup, CComboBox, CButton gibi standart UI öğelerini kullanarak kodu karmaşıklaştırma (buna yeni yöntemler de yazdım ve mevcut olanlardan bazılarını geçersiz kıldım)
  3. Yeni yapıyla ilgili hata ayıklayıcı hatası (olası, ancak olası değil)

Yapı ve sistem bilgisi:

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 terminal Windows 10 build 14393, Intel Core i5-5200U @ 2.20GHz, 2/3 Gb bellek, 61/380 Gb disk, IE 11, UAC, GMT+2

Hata ayıklayıcıyla benzer sorunları kim yaşadı ve nedeni ne olabilir?
 
fxsaber :

Öyleyse, Optimize Edici'den daha fazla verim istiyorsanız, SymbolInfo işlevleri için dize referanslı çözümün doğru olduğu açıktır.

Evet, bu bağlantının bir anlamı yok, geliştirici tarafından söyleniyor. Her şey referansla iletilir. Fark sadece eski MQL4'teydi. Ve bir dize okurken hiçbir kontrol yoktur.
 
Alexey Navoykov :
Evet, bu bağlantının bir anlamı yok, geliştirici tarafından söyleniyor. Her şey referansla iletilir. Fark sadece eski MQL4'teydi. Ve bir dize okurken hiçbir kontrol yoktur.

Bu tür iddialar sadece sıkıcı.

 int f1( string Str )
{
   return ((Str += Str) == Str);
}

int f2( string &Str )
{
   return ((Str += Str) == Str);
}

int Bench1( const int Amount = 1 e8 )
{
   int Res = 0 ;
   string Str = NULL ;
  
   for ( int i = 0 ; i < Amount; i++)
    Res += f1(Str);
    
   Print (Res);
    
   return (Res);    
}

int Bench2( const int Amount = 1 e8 )
{
   int Res = 0 ;
   string Str = NULL ;
  
   for ( int i = 0 ; i < Amount; i++)
    Res += f2(Str);

   Print (Res);
    
   return (Res);    
}

void OnStart ()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


         100000000
        Time[Bench1()] = 727585
         100000000
        Time[Bench2()] = 657464
         100000000
        Time[Bench1()] = 794205
         100000000
        Time[Bench2()] = 670440
 
fxsaber :

Bu tür iddialar sadece sıkıcı.


Belki yazmak daha kolaydır:

 int f1( string Str )
{
   return (Str == NULL || Str == "");
}

?...

Neden böyle içiyorsun?

 int f1( string Str )
{
   return ((Str += Str) == Str);
}
 
Mihail Matkovskij :

Belki yazmak daha kolaydır:

Diğerleri tartışılıyor.

 
fxsaber :

Bu tür iddialar sadece sıkıcı.

asılsız olmamak için, çizginin değişmediği testler için bir kıyaslama getirin.
 
TheXpert :
asılsız olmamak için, çizginin değişmediği testler için bir kıyaslama getirin.
 int f1( const string Str )
{
   return (Str + "1" != Str);
}

int f2( const string &Str )
{
   return (Str + "1" != Str);
}
         10000000
        Time[Bench1()] = 334596
         10000000
        Time[Bench2()] = 338559
         10000000
        Time[Bench1()] = 384711
         10000000
        Time[Bench2()] = 344346