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

 
Sergey Dzyublik :

1. Belirsizliği giderme davranışı:
CPrimeGenerator::ExpandPrime'a parametre olarak "INT_MAX - 10" iletmek, "INT_MAX" sonucunu döndürür.
CPrimeGenerator::GetPrime'a parametre olarak "INT_MAX - 10" iletmek aynı sonucu döndürür: "INT_MAX - 10".

Ayrıca her iki durumda da döndürülen değerin asal sayı olmaması kullanıcıyı yanıltır.

İlk nokta için:

Burada bir belirsizlik yok.

GetPrime yöntemi üstten en yakın asal sayıyı döndürmelidir, ancak INT_MAX - 10 ile INT_MAX arasında hiçbiri yoktur, bu nedenle INT_MAX - 10 döndürülür.

ExpandPrime yöntemi, giriş değerini baştan ikiye katlar ve GetPrime yöntemi, alınan numaradan çağrılır.

Ayrıca ExpandPrime, INT_MAX'ın ötesine geçmek için bir kontrole sahiptir:

   if (( uint )new_size> INT_MAX && INT_MAX >old_size)
       return INT_MAX ;
   else
       return GetPrime(new_size);

Bana göre, bu yöntemlerin davranışının mantığı kesinlikle açık ve doğrudur.


İkinci ve üçüncü noktalarla ilgili olarak:

Önerdiğiniz değişiklikler çoğunlukla yalnızca CHashMap boyutlarının çok büyük olduğu uç durumlarla ilgilidir. Ancak, performans üzerinde olumlu bir etkisi olacağının garantisi yoktur, bu nedenle önerdiğiniz değişikliklerin doğruluğunu belirlemek için ayrı çalışmalar yapmanız gerekir.

 
Roman Konopelko :

Burada bir belirsizlik yok.
GetPrime yöntemi üstten en yakın asal sayıyı döndürmelidir, ancak INT_MAX - 10 ile INT_MAX arasında hiçbiri yoktur, bu nedenle INT_MAX - 10 döndürülür.
ExpandPrime yöntemi, giriş değerini baştan ikiye katlar ve GetPrime yöntemi, alınan numaradan çağrılır.
Ayrıca ExpandPrime, INT_MAX'ın ötesine geçmek için bir kontrole sahiptir:
Bana göre, bu yöntemlerin davranışının mantığı kesinlikle açık ve doğrudur.


1. Fonksiyonlar asal sayılar döndüremez, ancak hangi sayıların olduğu belli değildir.
Kullanıcının bu verileri nasıl kullandığı onun sorunu, belki onu uzun bir süreye çevirir ve sonra süper hesaplama işlevlerine aktarır, fark nedir.
Gerçek şu ki, dönüş, varsayılan olarak işlevlerden bildirilen ve beklenen şey olmayabilir.

2. İşlev çağrısının yalnızca rastgele sayılar değil de bir asal sayı döndürüp döndürmediği nasıl kontrol edilir?
Sadece INT_MAX ile karşılaştırmak işe yaramaz.
INT_MAX'tan küçük olan son kullanılabilir asal sayı ile karşılaştırmanız gerekir.
Her şeyin doğru çalıştığından emin olmak için bu işlevleri çağırmanın sonucunu bazı sihirli sayılarla karşılaştırmak için her zaman - bana gelince, bu saçmalık.

 
Sergey Dzyublik :

1. Fonksiyonlar asal sayılar döndüremez, ancak hangi sayıların olduğu belli değildir.
Kullanıcının bu verileri nasıl kullandığı onun sorunu, belki onu uzun bir süreye çevirir ve sonra süper hesaplama işlevlerine aktarır, fark nedir.
Gerçek şu ki, dönüş, varsayılan olarak işlevlerden bildirilen ve beklenen şey olmayabilir.

2. İşlev çağrısının yalnızca rastgele sayılar değil de bir asal sayı döndürüp döndürmediği nasıl kontrol edilir?
Sadece INT_MAX ile karşılaştırmak işe yaramaz.
INT_MAX'tan küçük mevcut en son asal sayı ile karşılaştırmanız gerekir.
Her şeyin doğru çalıştığından emin olmak için bu işlevleri çağırmanın sonucunu bazı sihirli sayılarla karşılaştırmak için her zaman - bana gelince, bu saçmalık.

1. GetPrime yöntemiyle asal olmayan bir sayı alma durumunuz şu ana kadar gördüğüm tek durumdur. Bu olay, asal sayılar oluşturulurken kontrol değiştirilerek düzeltilecektir:

 //--- outside of our predefined table
   for ( int i=(min| 1 ); i<= INT_MAX ; i+= 2 )
     {
       if (IsPrime(i) && ((i- 1 )%s_hash_prime!= 0 ))
         return (i);
     }
   return (min);

2. Bir sayının asal olup olmadığını kontrol etmek için CPrimeGenerator::IsPrime yöntemi uygulanır

 

ArrayList'imden Generic/ArrayList.mqh'deki sizinkine geçmeye çalıştım

"."den sonra BEN hiçbir şey üretmez.

Değer nasıl alınır? Get() ve [] sınıfta eksik.

Ve bir dizi işaretçi olabileceğini hesaba katmaz.

Peki bu kütüphaneyi kim oluşturuyor?

İşte benim Java ArrayList varyantım:

Dosyalar:
ArrayList.mqh  46 kb
 
Bu varyasyonu oluşturduğumda sınıf şablonu yoktu.
 
Roman Konopelko :

Genel koleksiyonların sınıf nesneleriyle doğru şekilde çalışması için bu sınıfların Equals ve HashCode yöntemlerini tanımlayan IEqualityComparable arabirimini uygulaması gerekir. Onlar. kullanıcının hash kodlarını hesaplamak için yöntemler belirlemesi gerekir ve bu, örneğin .Net'te olduğu gibi, MQL5 araçlarını kullanarak bu yöntemleri otomatik olarak uygulamak imkansız olduğundan, şimdiye kadarki tek seçenek budur.

Öyleyse şablonunuz neden programcıyı yanıltarak herhangi bir türle çalışıyor? Yalnızca IEqualityComparable'dan devralan sınıflar doğru çalışıyorsa, derleyici düzeyinde diğer türlerle çalışmayı yasaklamanız gerekir.

Unutma, bu kod:

 //+------------------------------------------------------------------+
//| Returns a hashcode for custom object.                            |
//+------------------------------------------------------------------+
template < typename T>
int GetHashCode(T value)
  {
//--- try to convert to equality comparable object  
   IEqualityComparable<T>*equtable= dynamic_cast <IEqualityComparable<T>*>(value);
   if (equtable)
     {
       //--- calculate hash by specied method   
       return equtable.HashCode();
     }
   else
     {
       //--- calculate hash from name of object
       return GetHashCode( typename (value));
     }
  }

Bu işlevin aşağıdakilerle değiştirilmesi gerektiğini düşünüyorum:

 template < typename T>
int GetHashCode(IEqualityComparable<T> &value)
  {
     return value.HashCode()
  }
 
Alexey Navoykov :

Öyleyse şablonunuz neden programcıyı yanıltarak herhangi bir türle çalışıyor? Yalnızca IEqualityComparable'dan devralan sınıflar doğru çalışıyorsa, derleyici düzeyinde diğer türlerle çalışmayı yasaklamanız gerekir.

Bu, çalışmak için elverişsiz olacaktır. Standart türler için GetHashCode aşırı yüklemeleri, bir karma kod elde etmek için bir arabirim sağlar.


Yokluğu can sıkıcı

 template < typename T>
interface IEqualityComparable
  {
//--- method for determining equality
   bool               Equals(T & value);
//--- method to calculate hash code   
   int                HashCode( void );
  };


Onlar. şimdi bummer nesneler için.

 
fxsaber :

Bu, çalışmak için elverişsiz olacaktır. Standart türler için GetHashCode aşırı yüklemeleri, bir karma kod elde etmek için bir arabirim sağlar.

Şimdi kolaylık nedir? Bu işleve bir arabirimi desteklemeyen bir sınıfa bir numaralandırma veya işaretçi ileterek, yalnızca sınıfın adını elde ettiğiniz gerçeği mi? Muhteşem karma ) Ve en önemlisi, kod her şey yolundaymış gibi çalışır, derlenir. Konu o değil.

 
Alexey Navoykov :

Şimdi kolaylık nedir? Bu işleve bir arabirimi desteklemeyen bir sınıfa bir numaralandırma veya işaretçi ileterek, yalnızca sınıfın adını elde ettiğiniz gerçeği mi? Muhteşem karma ) Ve en önemlisi, kod her şey yolundaymış gibi çalışır, derlenir. Konu o değil.

Evet, hile yaptılar. NetFramework'ten düşüncesizce kopyala-yapıştır yapılmıştır, ancak dil düzeyinde arayüz desteği olmadan bunun yeterince çalışamayacağı açıktır. 6-7 yıl önce ve şimdiki MQ kodlarının seviyesini hatırlıyorum - o zamana kıyasla, bugün bir tür karanlık var.

 
Alexey Navoykov :

Şimdi kolaylık nedir? Bu işleve bir arabirimi desteklemeyen bir sınıfa bir numaralandırma veya işaretçi ileterek, yalnızca sınıfın adını elde ettiğiniz gerçeği mi? Muhteşem karma ) Ve en önemlisi, kod her şey yolundaymış gibi çalışır, derlenir. Konu o değil.

Katılıyorum, neden uzun süre çalışmadığını anlamaktan hemen bir derleme hatası almak daha iyidir.

Dürüst olmak gerekirse, arayüzün neden orada takıldığı hemen belli değil. Sonuçta, IEqualityComparable'ı çitlemeye başlamak yerine, istenen tür için GetHashCode'un aşırı yüklenmesini önerir.