MQL5'te OOP hakkında sorular - sayfa 11

 
Dmitry Fedoseev :

Ve kuşlardan bahsetmişken, tanımlayıcılar da işaretçilerdir. Ve bilirsiniz, kelimenin kendisinden, ister tanımlayıcı, ister işaretçi, ister tanımlayıcı olsun hiçbir şey değişmez.

bu kelimelerin fiziksel uygulaması uzun süredir kullanıcılardan gizlenmiştir.

IMHO şöyle bir şey:

- tanımlayıcı - sistemde bu işlevi uygulayan yönteme bağlı

- tanıtıcı, her şey bir tanımlayıcı gibidir, ancak işletim sistemi tarafından uygulanır

- işaretçi ve tanımlayıcı, bunun fiziksel bir bellek işlemi olduğunu ima eder

 
Dmitry Fedoseev :

Ve fonksiyonda bir nesne yaratmak için fonksiyona bir işaretçi iletmeniz gerekiyorsa, şu şekilde çalışır:

 class CObj{
   public :
   int f(){
       return ( 33 );
   }
};

CObj * obj;

void OnStart (){
  z(obj);
   delete (obj);
}

void z(CObj & o){
   o = new CObj();
}
Bu aslında OOP hakkında bilmek istediğiniz, ancak sormaya korktuğunuz her şey)))

Harika.

Bu 17 satır aslında Fedoseev'in bir programcı olarak nitelikleri hakkında bilmeniz gereken tek şey.

2019.07.05 15:19:56.309 'test13.mq5' (11,5) içinde geçersiz işaretçi erişimi

 
Vasiliy Sokolov :

Tünaydın. Bilgisayar belleği, yığın veya yığın bağlamında kullanılsa da aynı performansa sahiptir. Dinamik belleğin yönetimi, çöp toplayıcının uygulanmasına bağlıdır: örneğin, Python'da olduğu gibi (daha yavaş sürüm) referans sayımı veya arka plan işleminde yürütme grafiğini atlayarak nesne oluşturma dönemlerinin analizi (Net CLR) olabilir. MQL'de hangi varyantın kullanıldığı bilinmiyor, ancak aşırı verimliliğini varsayabiliriz, çünkü MQL5 kullanıcısının doğrudan silme operatörüne erişimi vardır, bu da GC'nin çalışmasını büyük ölçüde basitleştirir. Bu bağlamda, yeni kullanırken ek yük ile ilgili endişeleriniz boşuna - dinamik bellek kullanmaktan çekinmeyin.

"Yığın taşması"na gelince, bu duruma modern sistemlerde ancak karmaşık özyineleme kullanıldığında veya özyinelemeli algoritmada bir hata olduğunda rastlamak mümkündür. Modern bir program her zaman korumalı OC modunda, dinamik sayfa yükleme ile sanal bir adres alanında çalışır, bu nedenle endişelenmeyin: yığın bitmeyecek :)

Açıklayıcı açıklama için teşekkürler.
Nedense, özellikle çöp toplayıcının uygulamasını bilmediğimiz için, mql'de yığına yapılan bir çağrının yığından daha hızlı olduğunu düşündüm.
Bu nedenle, bir nesne oluşturma hızı için daha iyi olan bu tür sorular ortaya çıktı , otomatik veya dinamik.
Evet, her şeyin belirli göreve bağlı olduğunu anlıyorum, ancak örneğin, ticaret taleplerinin gönderilmesini ele alalım.
Ve işleme hızı için mümkün olduğunca doğru nesneler yaratma görevini kendimize belirledik.
Açıklanan ticaret emirleri yöntemleri için özel bir sınıfımız var.
Bir sınıfın örneklerinin sayısı ve yöntemleri esasen bizim tarafımızdan bilinmektedir.
Ve "yığın bitmeyeceğini" nasıl varsayıyorsunuz?

Dolayısıyla soru şu ki, nesneleri oluşturmanın ve silmenin en iyi yolu nedir? Otomatik mi, dinamik mi?
Genel olarak otomatik nesnelerin sentetik kontrolünü yapma fikrini buldum.
Diğer bir deyişle, özel bir işlevin gövdesinde otomatik nesneler bildirin.
Böylece, nesne yığın üzerinde oluşturulur (teoride, yığından daha hızlıdır), nesne değişkeni kullanıcı tanımlı bir işlevde bildirildiği için otomatik silme kontrolü hakkında endişelenmeyiz.
ve otomatik nesne ayrıca, işlevlerdeki dinamik değişkenler kuralına göre, kullanıcı tanımlı işlevin kendisi tarafından yok edilmek üzere kontrol edilecektir.
Burada da ilgili branşın bu konuda düşünen katılımcılarının yeterli görüşlerini dinlemek arzu edilir.

 
TheXpert :

Harika.

Bu 17 satır aslında Fedoseev'in bir programcı olarak nitelikleri hakkında bilmeniz gereken tek şey.

2019.07.05 15:19:56.309 'test13.mq5' (11,5) içinde geçersiz işaretçi erişimi

Muhteşem. Ve benim için hatasız derleniyor (şu anda) ve doğru çalışıyor.

Bir dahaki sefere Photoshop'ta çizin.

 
Roman :

Açıklayıcı açıklama için teşekkürler.
Nedense, özellikle çöp toplayıcının uygulamasını bilmediğimiz için, mql'de yığına yapılan bir çağrının yığından daha hızlı olduğunu düşündüm.
Bu nedenle, bir nesne oluşturma hızı için daha iyi olan bu tür sorular ortaya çıktı , otomatik veya dinamik.
Evet, her şeyin belirli göreve bağlı olduğunu anlıyorum, ancak örneğin, ticaret taleplerinin gönderilmesini ele alalım.
Ve işleme hızı için mümkün olduğunca doğru nesneler yaratma görevini kendimize belirledik.
Açıklanan ticaret emirleri yöntemleri için özel bir sınıfımız var.
Bir sınıfın örneklerinin sayısı ve yöntemleri esasen bizim tarafımızdan bilinmektedir.
Ve "yığın bitmeyeceğini" nasıl varsayıyorsunuz?

Dolayısıyla soru şu ki, nesneleri oluşturmanın ve silmenin en iyi yolu nedir? Otomatik mi, dinamik mi?
Genel olarak otomatik nesnelerin sentetik kontrolünü yapma fikrini buldum.
Diğer bir deyişle, özel bir işlevin gövdesinde otomatik nesneler bildirin.
Böylece, nesne yığında oluşturulur (teoride, yığından daha hızlıdır), nesne değişkeni kullanıcı tanımlı bir işlevde bildirildiğinden otomatik silme kontrolü hakkında endişelenmeyiz.
ve otomatik nesne ayrıca, işlevlerdeki dinamik değişkenler kuralına göre, kullanıcı tanımlı işlevin kendisi tarafından yok edilmek üzere kontrol edilecektir.
Bu nedenle, bu konu hakkında düşünen katılımcıların yeterli görüşlerini duymak istiyorum.

Doğru düşündün. new ile oluşturulan nesnelere erişim çok daha yavaştır. Burada çöp toplayıcı yok.

 
Igor Makanu :

bu kelimelerin fiziksel uygulaması uzun süredir kullanıcılardan gizlenmiştir.

IMHO şöyle bir şey:

- tanımlayıcı - sistemde bu işlevi uygulayan yönteme bağlı

- tanıtıcı, her şey bir tanımlayıcı gibidir, ancak işletim sistemi tarafından uygulanır

- işaretçi ve tanımlayıcı, bunun fiziksel bir bellek işlemi olduğunu ima eder

Evet ve orada nasıl çalıştığı bizim için fark etmez.

 

Bana bir soru daha söyle. CButton'dan bir CMyButton alt sınıfı oluşturursanız, bir düğme oluşturabilir ve ardından özelliklerini sınıfın dışında değiştirebilirsiniz. Bu, aşağıdaki OnInit() içinde yapılır.

Ancak, alt sınıf içinde ek alanlar oluşturmak ve CButton sınıfının yerleşik özelliklerini yeni işlevlerde kullanmak istersem, bunu nasıl doğru şekilde uygulayabilirim?

CButton sınıfında, m_button sınıfının üyesi özel bölümde bildirilir.

 #include <Controls\Button.mqh>

class CMyButton : public CButton
{ 
   private : 

   public : 
              CMyButton( void ){}; 
             ~CMyButton( void ){}; 
             
         bool     isPrevState;         // состояние кнопки на предыд.тике, true - была нажата     
         void     setButton();         // создаем кнопку
         void     setProp();           // задаем в ходе программы свойства
}; 

void CMyButton::setButton( void )
{
   // как в этой функции создать кнопку? Я не могу вызвать метод Create()
}

//+------------------------------------------------------------------------------------------------------------------+
//| 
//+------------------------------------------------------------------------------------------------------------------+

CButton Btn;
CMyButton MyBtn;

int OnInit ()
  {
  
   Btn.Create( 0 , "Btn" , 0 , 50 , 50 , 120 , 75 );
   Btn.Text( "Standart" );
   MyBtn.Create( 0 , "MyBtn" , 0 , 50 , 200 , 150 , 225 );
   MyBtn.Text( "MyBtn" );
   
   return ( INIT_SUCCEEDED );
  }
 
Dmitry Fedoseev :

Evet, sadece danışman yazan programcılar hayattan sıkılmasın diye bir bellek sızıntısı hakkında bir mesaj siliyor ve yazıyor.

Acaba dün bir bellek sızıntısı olduğu ortaya çıktı ve bugün prensipte var olamaz.

Ve kuşlardan bahsetmişken, tanımlayıcılar da işaretçilerdir. Ve bilirsiniz, kelimenin kendisinden, ister tanımlayıcı, ister işaretçi, ister tanımlayıcı olsun hiçbir şey değişmez.

Sızıntı, işlemin adres alanından gelir. Bu, while (true) döngüsünde bir sızıntı yaptığınızda, sonunda, yığından bir sonraki bellek tahsisi sona erdiğinde programınız çökecektir.
 
Dmitry Fedoseev :

Ve benim için hatasız derleniyor (şu anda) ve doğru çalışıyor.

Evet, zaten alakasız iki kişi kodunuzun çökmesini fotoğraflıyor)

Kodunuz düzgün çalışmıyor, kodun kendisinden belli oluyor))

 
TheXpert :

Evet, zaten alakasız iki kişi kodunuzun çökmesini fotoğraflıyor)

Kodunuz düzgün çalışmıyor, kodun kendisinden belli oluyor))

bende aynısını yazmak istedim
Neden: