Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 19
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Sonuçta, bir sınıf için kendi uzmanlığınızı yazabilirsiniz.
Arayüz olmadan yapamazsınız.
Arayüz olmadan yapamazsınız.
Arayüz olmadan imkansız olan nedir? )
Peki, düşünüyorsun. Kısacası dal plizini çöpe atmayın.
Sorun
Açıkçası, GetHashCode, MQL5 kullanıcı ortamında düzgün bir şekilde uygulanamaz. Bunun nedeni, tüm nesnelere erişilememesidir. Ve eğer double int, vb. Gibi ilkel üyelerde ise. uygulama iyi çalışıyor, daha sonra karmaşık nesneler (sınıflar, yapılar ve hatta numaralandırmalar) için karma ada göre hesaplanır. Açıkçası, CObject türünde veya hatta ENUM _something_there türünde bin nesnemiz varsa, o zaman hem CHashMap hem de CHashSet normal bir LinkedList'e dönüşür:
Bundan kaçınmanın bir yolu yok, çünkü kullanıcı düzeyinde sahip olduğumuz tek şey nesnenin adı:
Bu nedenle, karmaşık türlerdeki tüm nesnelerin karma değerleri birbirine eşittir ve bu arama kodu tam bir dizi araması kullanır:
Aslında, bu o kadar kritik ki, tüm Jenerik'i tomurcukta kullanma noktasını aşıyor. Gerçek şu ki, çoğu durumda karmaşık nesnelerin ilişkilendirilmesi veya depolanması gerekir: numaralandırmalar, yapılar veya sınıflar. Yalnızca basit tiplerin çalıştırılması gerekseydi, daha basit bir şey yapılabilirdi.
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.
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.
Roman, MQL5'te arayüz olmadığını söylemeyi unuttun. Günümüzün MQL5'inde arayüzler hakkında herhangi bir konuşma kötü niyetli ima ve demagojidir .
ps Ancak arabirimler MQL5'te görünse bile, yapılar ve numaralandırmalarla ilgili sorun çözülmeden kalacaktır.
Roman, MQL5'te arayüz olmadığını söylemeyi unuttun. Günümüzün MQL5'inde arayüzler hakkında herhangi bir konuşma kötü niyetli ima ve demagojidir .
ps Ancak arabirimler MQL5'te görünse bile, yapılar ve numaralandırmalarla ilgili sorun çözülmeden kalacaktır.
MQL5'te, veri aktarımının özelliklerinden dolayı sınıflar, yapılar ve numaralandırmalar için aynı anda çalışacak şablon yöntemleri yazmak prensipte şu anda imkansızdır.
Bununla ilgili. Ancak MQL5 ortamı, nesneleri hakkında her şeyi bilir! Ayrıca nesne işaretçilerine sahiptir ve tüm numaralandırma tanımlayıcılarını (EnumToString) bilir. Bu nedenle GetHashCode bir sistem ve omnivor bir fonksiyon olarak gereklidir.
Son olarak, arabirimlerin çoklu mirasına izin verin. Normal arayüzler için Generic'i yeniden yazın ve bir şeker olacak.
Durum açıktır: MQ geliştiricileri, C++'da çoklu kalıtım tarafından o kadar sık yakılmıştır ki, artık tezahürlerinden herhangi birinden korkmaktadırlar. Sonuç olarak, başka bir çöp: gülünç miras zincirleri kullanılarak bir çöpten (çoklu kalıtım) kaçınılması önerilir.
Arayüzlerin kalıtımla ilgisi olmadığını anlayacaksınız. Arayüz, bir sınıfın belirli bir işlevi sağlamayı taahhüt ettiği bir beyandır. İki sınıf aynı işlevi uygularsa, birbirlerinden miras almamalıdırlar. Miras = kötülük .
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
Genel sınıf kitaplığı - hatalar, açıklama, sorular, kullanım ve öneriler
Roman Konopelko , 2017.12.18 16:29
1) Hacim büyüme katsayısı (kapasite) 1.2'ye eşit değildir, CHashMap'te yeni hacmi hesaplamak için CPrimeGenerator::ExpandPrime yöntemi kullanılır:
Bu yöntemde, koleksiyonun eski boyutu iki ile çarpılır, ardından ortaya çıkan değer için üstten en yakın asal sayıyı bulup yeni hacim olarak döndürürüz.
Kapasitenin başlangıç değeri hakkında - Katılıyorum, çok küçük.
Ancak diğer yandan, başlangıç hacmini açıkça belirtebileceğiniz yapıcılar her zaman vardır:
Bu nedenle, burada bir şeyi değiştirmenin pek bir anlamı görmüyorum.
Evet, yanılmışım, üzgünüm.
Gerçekten de, CHashMap için hacim büyüme faktörü (kapasite) 2'den büyüktür.
Hatayı belirttiğiniz için teşekkürler ve zamanınızı boşa harcadığım için özür dilerim.
Öte yandan, CPrimeGenerator uygulamasını incelemek için zaman ayırmayı başardım.
Ve esas olarak performansı artırmak için birkaç öneri var.
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.
2. 7199369'dan büyük numaralar için GetPrime çağrılırken , bellek tasarrufu bir öncelik haline gelir, ancak bu, göreceli olarak düşük performansı ve işe yaramaz hesaplamaları haklı çıkarmaz.
Sunulan:
- CPrimeGenerator::s_primes[] dizisinin son değeriyle sayının bir karşılaştırmasını ekleyin ve 72 dizi öğesinin gereksiz bir numaralandırmasını gerçekleştirmeyin.
- bir asal sayı için dinamik aramayı (bir satırdaki tüm sayılardan geçer) CPrimeGenerator::s_primes[] gibi bir dizi önceden tanımlanmış değerle değiştirin, ancak ikinci dereceden bir artışla değil, doğrusal olanla .
Değerlerdeki artış yaklaşık 1 milyon olacaktır (rakam dizinin son elemanlarındaki s_primes artışına benzer).
3000'e kadar eleman sayısı, 8M ile INT_MAX aralığında değerler.
Dizi araması üst sınır ikili arama yoluyla gerçekleştirilecektir, gerekli yineleme sayısı 12'dir.
3. GetPrime'ı 7199369'dan küçük sayılar için çağırırken , en kötü durumda, CPrimeGenerator::s_primes[] dizisinin 72 değerinin tümünün doğrusal bir numaralandırması gerçekleştirilir.
Sunulan:
- dizideki eleman sayısını 70 adete düşürün. (ilk ikisini veya ilk ve sonuncuyu kaldırarak):
- giriş değeri yeni CPrimeGenerator::s_primes dizisindeki 6. değerden küçük veya ona eşitse - o zaman sayıları doğrusal olarak sıralayın (6 karşılaştırmaya kadar).
- aksi takdirde dizinin 7. ve 70. değerleri arasında üst sınır ikili aramayı kullanın (yaklaşık 6 yineleme).
Buradaki fikir, ikili aramaya kıyasla performans cezası olmadığı sürece doğrusal yineleme kullanmaktır.
Önerilen eleman sayısı - 6 örnek olarak kullanılmıştır, gerçekte hepsi üst sınır ikili aramanın özel uygulamasına bağlıdır.
Belirli bir işlevi çağırmanın düşük yoğunluğundan kaynaklanan genel performans kazancı, bu işlevi geliştirmek için herhangi bir çalışma yapacak kadar faydalı olmayabilir.