"MQL5'te Nesne Yaratma ve Yok Etme" makalesi için tartışma

 

Yeni makale MQL5'te Nesne Yaratma ve Yok Etme yayınlandı:

İster özel bir nesne, ister dinamik bir dizi veya bir nesne dizisi olsun, her nesne MQL5 programında kendine özgü şekilde oluşturulur ve silinir. Çoğu zaman, bazı nesneler diğer nesnelerin bir parçasıdır ve sonlandırma sırasında nesne silme sırası özellikle önemli hale gelir. Bu makale, nesnelerle çalışma mekanizmalarını kapsayan bazı örnekler sunmaktadır.

MQL5 programları, Nesne Yönelimli Programlama (OOP) kavramlarıyla yazılmıştır ve bu, yalnızca özel kitaplıklar oluşturmak için yeni olanaklar açmakla kalmaz, aynı zamanda diğer geliştiricilerin eksiksiz ve test edilmiş sınıflarını kullanabilmenizi de sağlar. MetaTrader 5 Müşteri Terminali'nin içerdiği Standart Kitaplıkta, binlerce yöntemi içeren yüzlerce sınıf vardır.

OOP'nin tüm avantajlarından yararlanmak için MQL5 programlarında nesne oluşturma ve silme ile ilgili bazı ayrıntıları netleştirmemiz gerekir. Nesne Oluşturma ve Silme, Belgeler bölümünde kısaca açıklanmıştır ve bu makale bu konuyu örneklerle açıklayacaktır.

Yazar: MetaQuotes

 

LocalVar_TestScript_2.mq5 ilk kez çalıştırıldığında, yalnızca

PO      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
LD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
HJ      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
DS      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
PH      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::CItem Constructor
GP      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
KF      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
OM      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
CD      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor
GK      0       LocalVar_TestScript_2 (EURGBP,M1)       12:08:19        CItem::~CItem Destructor

yani"geçersiz işaretçiyi sil" mesajı olmadan.Aynı dosyayı yeniden derledikten sonra (yani ikinci derlemeden sonra), bunu gösteriyor:

PQ      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
LH      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
HO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
DF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
PL      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::CItem Constructor
GR      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
KK      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
OP      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
CF      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
GO      0       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        CItem::~CItem Destructor
PH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
RP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
DH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
FP      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
HH      1       LocalVar_TestScript_2 (EURUSD,H1)       12:09:12        敤敬整渠湯搠湹浡捩漠橢捥t
Makalenin yayınlanmasından bu yana terminalin geçersiz işaretçileri silmeye yönelik tepkisi değişti mi? XP, 32
 
Yedelkin:

LocalVar_TestScript_2.mq5 ilk kez çalıştırıldığında, yalnızca

yani"geçersiz işaretçiyi sil" mesajı olmadan.Aynı dosyayı yeniden derledikten sonra (yani ikinci derlemeden sonra), bunu gösteriyor:

Makalenin yayınlanmasından bu yana terminalin geçersiz işaretçileri silmeye yönelik tepkisi değişti mi? XP, 32
Mesaj için teşekkürler. Düzeltildi. Davranış değişti, artık"geçersiz işaretçiyi sil" mesajıyalnızca hata ayıklama için derlenirken oluşturuluyor.
 

mql5:
Спасибо за сообщение. Исправлено. Поведение изменилось, теперь сообщение "delete invalid pointer" выдаётся только при компиляции под отладку.

Tamam, makalenin açıklığa kavuşturulmasını istiyoruz.
 

Neden bu satır kurucunun çalışmasına neden oluyor?

 CItem* array1[5];

ve bu çalışmıyor:

CObjectC *pObjectC;
?
 
New operatörü sadece sınıfı dinamik hale getirmek için mi gereklidir? Ancak dinamik bir dizi "ilk köşeli parantez çiftinde belirtilmemiş bir değer olan bir dizi" ise, dinamik bir sınıf nedir?
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Burgunsky:

Neden bu satır kurucunun çağrılmasına neden oluyor:

Kontrol ettim, yapıcı çağrısı yapılmadı, lütfen tüm kodu ekleyin lütfen
 
Burgunsky:

Ve neden bu satır kurucunun çalışmasına neden olur: CItem* array1[5];,

ancak bu değil: CObjectC *pObjectC; ?

Anladığım kadarıyla

CItem* array1[5];

tek başına kurucunun başlatılmasına neden olmaz. İşte makaleden daha eksiksiz bir kod:

void OnStart()
  {
//--- nesnenin ilk işaretçi dizisini bildirir
   CItem* array1[5];
//--- nesnenin ikinci işaretçi dizisini bildirir
   CItem* array2[5];
//--- şimdi döngüdeki dizileri dolduralım
   for(int i=0;i<5;i++)
     {
      //--- ilk dizi için işaretçi new operatörü tarafından oluşturulacaktır
      array1[i]=new CItem;
      //--- ikinci dizinin işaretçisi ilk diziden kopyalanacaktır
      array2[i]=array1[i];
     }
Yapıcı, ilk işaretçi dizisi bildirilirken değil, bu dizi new operatörü kullanılarak bir döngü içinde doldurulurken çağrılır.
 
Burgunsky:
New operatörü sadece sınıfı dinamik hale getirmek için mi gereklidir? Ama eğer dinamik bir dizi "ilk köşeli parantez çiftinde belirtilmemiş bir değer olan bir dizi" ise, dinamik bir sınıf nedir?
Programlamada "dinamik" kelimesinin çok anlamlı olduğunu anladım. Sınıflar söz konusu olduğunda, bir karşıtlık vardır: "otomatik olarak oluşturulan nesne" vs "dinamik olarak oluşturulan nesne". Aralarındaki fark, global düzeyde bildirilen değişkenler ile yerel düzeyde bildirilen değişkenler arasındaki farkla yaklaşık olarak aynıdır. Başka bir deyişle, "dinamik olarak yaratılan bir nesne" "bir süreliğine" yaratılan bir nesnedir, ömrü new operatörü tarafından yaratıldığı andan delete operatörü tarafından silindiği ana kadardır.
 

Ancak yine de sorular var:

New operatörü ile dinamik bir nesne oluşturmanın amacı nedir?

Otomatik olarak bir nesne oluştururken, sınıf nesnesi yığında oluşturulur, yürütme süresine göre dinamik nesneden daha hızlıdır.

Dinamik olarak bir nesne oluştururken, OS bellek yöneticisi kullanılırken sınıf nesnesi bellekte (yığında) oluşturulur, işlem daha yavaştır.

İşte bir soru: otomatik oluşturma daha hızlıysa, neden dinamik nesneler oluşturulur? Yığının taşmasını önlemek için mi?

 
Ekli kaynak kodu dosyaları ve HTML kodundaki kaynak kodu ekleri artık size kolaylık sağlamak için tamamen Portekizceye çevrilmiştir.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.