Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 24

 
fxsaber :

Anahtarla değer alma hakkında soru. Kütüphane kodunda, bu yöntem şöyle görünür

 //+------------------------------------------------------------------+
//| Find index of entry with specified key.                          |
//+------------------------------------------------------------------+
template < typename TKey, typename TValue>
int CHashMap::FindEntry(TKey key)
  {
   if (m_capacity!= NULL )
     {
       //--- get hash code from key
       int hash_code=m_comparer.HashCode(key)& 0x7FFFFFFF ;
       //--- search pair with specified key
       for ( int i=m_buckets[hash_code%m_capacity] ; i>= 0 ; i=m_entries[i].next )
         if (m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))
             return (i);
     }
   return (- 1 );
  }

Evet, i in for öğesinin standart olmayan yeniden atanması nedeniyle bu kod yanıltıcı olabilir.

İlk önce alt diziye, değerimizi içerebilecek indeksiyle erişiriz: i=m_buckets[hash_code%m_capacity]; (yani, bir alt dizinin veya bir değerler sepetinin indeksidir).

Daha sonra, aynı for, sepetin indeksi, sepetin elemanlarının indeksine dönüştürülür: i=m_entries[i].next

Aslında, kod doğru yazılmıştır, çünkü tipik bir durumda, her alt dizinin ortalama bir elemanı olacaktır ve döngü tekrar ortalama olarak yalnızca bir kez yürütülecektir.

 
Vasiliy Sokolov :

Evet, i'nin standart dışı yeniden atanması nedeniyle bu kod yanıltıcı olabilir.

İlk önce alt diziye, değerimizi içerebilecek indeksiyle erişiriz: i=m_buckets[hash_code%m_capacity]; (yani, bir alt dizinin veya bir değerler sepetinin indeksidir).

Daha sonra, aynı for, sepetin indeksi, sepetin elemanlarının indeksine dönüştürülür: i=m_entries[i].next

Aslında, kod doğru yazılmıştır, çünkü tipik bir durumda, her alt dizinin ortalama bir elemanı olacaktır ve döngü yine ortalama olarak yalnızca bir kez yürütülecektir.

Çarpışma durumunda döngünün yapıldığını anladım: mini listeyi gözden geçirin.

 
fxsaber :

Çarpışma durumunda döngünün yapıldığını anladım: mini listeyi gözden geçirin.

Evet, kesinlikle doğru.

 

Özel türleri depolamak için bir şablon kitaplığı ( CARrayList ) kullanıldı. İzlenim - mutlu değil. En azından biraz kolaylık sağlamak için makrolar yazdım

 #define CLEANUP   do {                                      \
   for ( int i_cln = 0 ;  i_cln < segs.Count();  ++ i_cln) {   \
      Wave_end *cln_el;                                     \
       if (  segs.TryGetValue(i_cln, cln_el) )                \
         delete cln_el;                                     \
   }} while ( false )
#define SSEG(IND)   do {                \
if ( ! segs.TryGetValue(IND, we) ) {    \
   CLEANUP;                            \
   continue ;                           \
}} while ( false )

TryGetValue'nin ekstra kusursuzluğu + sınıfları değere göre geçememe, kullanımı acı verici hale getirir.

 
Bu konuyla ilgili olmayan yorumlar " MQL5 MT5 MetaTrader 5 Yeni Başlayanlardan Sorular " bölümüne taşındı.
 

Söyle bana, belki bir şey anlamıyorum, ama bu tür bir yapı kullanmaya çalışırsam:

 #include <Generic\\ArrayList.mqh>

struct Option {
   string name;
   color   clr;
};

...

CArrayList<Option> _options;

sonra hatayı alıyorum:

'Seçenek' - nesneler yalnızca referans olarak iletilir ICollection.mqh on dört on sekiz

peki, daha fazla hata yığını var ...
 
Andrey Pogoreltsev :

Söyle bana, belki bir şey anlamıyorum, ama bu tür bir yapı kullanmaya çalışırsam:

sonra hatayı alıyorum:

'Seçenek' - nesneler yalnızca referans olarak iletilir ICollection.mqh on dört on sekiz

peki, daha fazla hata yığını var ...

Şu şekilde deneyin:

 #include <Generic\\ArrayList.mqh>

class Option {
   string name;
   color   clr;
};

...

CArrayList<Option * > _options;
 
Sergey Eremin :

Şu şekilde deneyin:

İşaretçileri bir koleksiyona geçirmek/depolamak kavramsal olarak yanlıştır.

 
Andrey Pogoreltsev :

İşaretçileri bir koleksiyona geçirmek/depolamak kavramsal olarak yanlıştır.

MQL kapsamında, birazcık bile kullanılabilen tek bir jenerik yoktur. herkesin ciddi söveleri vardır. yerleşik diziyi kullanın, başınızı daha az acıtacaktır

 
TheXpert :

MQL kapsamında, birazcık bile kullanılabilen tek bir jenerik yoktur. herkesin ciddi söveleri vardır. yerleşik diziyi kullanın, başınızı daha az acıtacaktır

yani evet dizi zayuzat. Yalnızca yerleşik türler için uygunlarsa, neden koleksiyonlar oluşturup bunları kod tabanına koyalım?)

Neden: