Hatalar, hatalar, sorular - sayfa 1183
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
Bir danışmanı test ederken hata veriyor
OrderSend işlevi için geçersiz kâr alma
Sipariş Gönderme hatası 4107
Danışman koduna girmeden nasıl düzeltebilirim?
Bu nesne için ZeroMemory işlevini kullanamazsınız
Apaçık. Ama derleyici neden bu hatayı ZeroMemory'nin kullanıldığı yerde değil de sınıfın bildirildiği yerde gösteriyor? Kafa karıştırıcı. Hatanın ne olduğunu ve nerede olduğunu anlamaya çalışarak kafamı çoktan kırdım. Siz, lütfen, hatanın doğru yerde verildiğini belirtin. Sonuçta, örneğin, kopyalanmasına izin verilmeyen öğeler içeren bir nesneyi kopyalarken, hata tam olarak kopyalama sırasında ve sınıfın içinde bir yerde değil.
Bütün bunların pratik tarafına gidersek, o zaman zaten sorunla yüzleşmem gerekiyordu. Kod, statik nesneler kullandı. Sonra bazılarını dinamik olanlarla değiştirmeye karar verdim. Sonuç olarak, karşılaştırma ve atama işlemleri oldukça farklı çalışmaya başladı. Ve bu sorunu tespit etmek zordu, çünkü. program normal şekilde derlenmeye ve çalışmaya devam ediyor, ancak olması gerektiği gibi değil.
Sorunun özünü hemen anlamadım
Bu, (a != a) öğesinin bir işaretçi karşılaştırmasıyla sonuçlanırken (a >> a) öğesinin >>( A* ) operatörüne bir çağrıyla sonuçlandığını gösterir.Bir çelişki var.
(a >> a) öğesinin davranışını diğer aşırı yüklenmiş operatörler gibi değiştiremezsiniz (== ve != hariç), çünkü bu, aşağıdaki yapıyı imkansız hale getirecektir, çünkü (A) döndürülemez, ancak yalnızca (A*) döndürülebilir. iade.
İşaretçiyi nesneye (*a) aktarma işleminin olmaması nedeniyle aşırı yüklenmiş operatörleri tam olarak kullanmak da imkansız olacaktır.
Sadece davranışı değiştirmek için kalır (== ve !=)
İşaretçileri (== ve !=) birbirleriyle ve bir sayı \ sıfırla (işaretçilerle yapılan diğer işlemler anlamsız olduğundan) karşılaştırmak için (GetPointer) gibi özel bir işlev tanıtmanız veya derleyiciye açıkça yayınlamasını söylemeniz gerekir.
Böylece aşırı yüklenmiş operatörlerin tam olarak kullanılması olasılığı kalacak ve yukarıdaki çelişki ortadan kalkacaktır.
Genel kuralın tek makul istisnası, operatör=() olmalıdır, çünkü
bir kerede tüm çelişkileri ortadan kaldıracaktır.
Kendimi düzelteceğim: aslında, böyle bir gösterim (*a) operatörlerin birden fazla uygulanması sorununu çözmediğinden (şimdi == ve != hariç tüm operatörlerle başarılı bir şekilde çalışır) çelişkiler yalnızca kısmen ortadan kalkar - bu nedenle, işaretçileri birbirleriyle karşılaştırmak için en iyi seçenek, eşitlik\eşitsizlik özel bir işlev kullanmaya devam etmektir - veya ulong yazmak için açık bir döküm
peki tamam
Derleme Hatasıİşaretçiler konusuna devam edersek, standart ' & ' işaretçi alma operatörünü MQL'ye eklemek güzel olurdu, hantal GetPointer'dan çok daha kullanışlı ve kompakt olurdu. Ve yukarıda tartışıldığı gibi ulong kullanarak döküm yapmaya gerek yoktur. Böylece, cephanelikte * ve & operatörlerine sahip olarak, gerekli işlemleri benzersiz bir şekilde belirleyebiliriz:
Ve bu ve işaretiyle ilgili bir şey daha var. MQL'de değişkenlere çok az referans vardır. Özellikle işaretçilerin sınırlı kullanımı göz önüne alındığında (yalnızca sınıf nesnelerine). Bir yapının veya çok boyutlu bir dizinin derinlemesine iç içe geçmiş bir öğesine erişmek genellikle gereklidir. Her seferinde tam yolu yazmanız gerekiyor, bu kodu çok karıştırıyor. Bir bağlantı oluşturarak her şeyi basitleştirebilirsiniz. Ve genel olarak, kolaylık sağlamak için bazı değişkenlerin adını yerel olarak "değiştirmek" gerekli olabilir. Ancak, burada açıkladığım şey. Bağlantı kullanmanın rahatlığı zaten herkes tarafından biliniyor. Ve şimdi bunun yerine #define kullanmanız gerekiyor, ki bu elbette çok kötü.
Eh, ayrıca bir işlevin sonucunu referans olarak iletme yeteneğine de ihtiyacınız var, yani. double & Func() { }
Son zamanlarda, Facebook'taki bloglardan yinelenen gönderiler oldu:
İşaretçiler konusuna devam edersek, standart ' & ' işaretçi alma operatörünü MQL'ye eklemek güzel olurdu, hantal GetPointer'dan çok daha kullanışlı ve kompakt olurdu. Ve yukarıda tartışıldığı gibi ulong kullanarak döküm yapmaya gerek yoktur. Böylece, cephanelikte * ve & operatörlerine sahip olarak, gerekli işlemleri benzersiz bir şekilde belirleyebiliriz:
Üye işlevlere yalnızca (*a) aracılığıyla erişimi kabul edersek, bu bariz avantajlar sağlamaz, aksine basit ve anlaşılır bir çoklu operatör uygulamasının imkansızlığına yol açar.
önerinize göre yeniden yazmayı deneyin
Ve bir işaretçi yerine nesnenin kendisini kullanamazsınız, çünkü <<(...) operatörü bir nesneye yalnızca bir işaretçi döndürebilir.
İşaretçilerle hangi işlemler anlamsız değildir? - yalnızca kendi aralarında ve bir sayı ile karşılaştırma - bu nedenle, operatörlerin onsuz birden fazla kullanım olasılığını korumak için özel bir işleve (örneğin, bool ComparePointer(a, b)) verilerek ihmal edilmeleri gerekir. aşırı yüklenmenin kendisi ana anlamını kaybeder.