Hatalar, hatalar, sorular - sayfa 2297

 
Nikolai Semko :

Teşekkürler ama orada sorularıma cevap göremedim.
A *a= new A; olduğunda yıkıcının neden çağrılmadığını anlamıyorum.

https://www.mql5.com/ru/docs/basis/variables/object_live

object_pointer = new Class_Name ifadesi tarafından oluşturulan tüm nesneler, daha sonra delete( object_pointer ) operatörü tarafından yok edilmelidir . Herhangi bir nedenle böyle bir değişken programın sonunda silme operatörü tarafından yok edilmemişse, "Uzmanlar" günlüğünde bununla ilgili bir mesaj görüntülenecektir. Birden çok değişken bildirebilir ve hepsine tek bir nesne işaretçisi atayabilirsiniz.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

MQL'den OnTimer() işlevini kontrol etmesini istiyorum.

Bazı nedenlerden dolayı, MT4 için strateji test cihazında çalışmıyor (Hiçbir hata yok, sadece bu işlevin içinde hiçbir şey yürütülmüyor), çevrimiçi her şey yolundayken.

MT5 için, işlev hem test cihazında hem de çevrimiçi olarak çalışır.

Teşekkür ederim!

 
Incorrect-Init'te çok zaman harcanıyor
Core 1   pass 114 tested with error "incorrect input parameters" in 0 : 00 : 00.218

OnInit'te yalnızca iki sayı karşılaştırılır ve Yanlış geçiş, tam geçişten daha fazla zaman alır! Nasıl yani?


Tam Optimizasyon için böyle bir danışman başlattık

 input int Range = 0 ; // задать Оптимизацию 1 .. 10000

int OnInit () { return ( INIT_PARAMETERS_INCORRECT ); }


8 Ajanın çalışmasının sonucunu alıyoruz

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Şimdi böyle bir danışman

 input int Range = 0 ; // задать Оптимизацию 1 .. 10000

void OnInit () {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Son olarak, böyle

 input int Range = 0 ; // задать Оптимизацию 1 .. 10000

void OnInit () { ExpertRemove (); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


iki sonuç

  1. Yanlış Başlatma ve ExpertRemove hız açısından aynıdır.
  2. Boş bir çalıştırma, OnInit'ten ayrılmaktan ~5 kat daha hızlıdır.


İkinci nokta açıkça bir hatadır. OnInit'ten atlamaktansa zamanda boş bir koşu yapmak benim için daha karlı. Lütfen düzeltin çünkü. Incorrect-Init ve ExpertRemove'un avantajları neredeyse tamamen kaybolur.

 

Danışmanlar/göstergeler/komut dosyaları ve hesapları içeren Sık Kullanılanlar sekmesi , yalnızca Terminal'den çıktıktan sonra hatırlanır. Bu nedenle, anormal bir çıkış (elektrik kesintisi) bu sekmeyi sıfırlar. Değiştirirken kaydetmek mümkün mü?

Bazen, Sık Kullanılanlara klasör eklemenin çok uygun olacağı konusunda net bir anlayış vardır.

 
A100 :
Sonra şöyle deneyin:

Sonuç:

1:POINTER_OTOMATİK
1:POINTER_DİNAMİK
2:POINTER_DİNAMİK
2:POINTER_OTOMATİK

Teşekkür ederim! Oldukça bir çözüm.

tek yol muhtemelen daha iyidir, böylece derleyici yemin etmez:

 class B  { public :
                     B( void *b) {d=b;}
                    ~B() { delete d; }
   void              *d; };

Görünüşe göre - bir böcek mi yoksa ne?
new aracılığıyla bir sınıfın örneğini oluştururken, yıkıcıyı çağırmaz.

Ve yıkıcıyı çağırmak için özel bir sınıf yaratmanın tek çözümü nedir? Yoksa onsuz yapmak hala mümkün mü?

 
Andrey Barinov :

Yeni operatörle oluştur ve sil operatörüyle sil

Soru, yıkıcıya delete koymaktır, ancak sınıfın bir örneğini new (A *a= new A;) aracılığıyla oluştururken, yıkıcı çağrılmaz.

 
aleger :

Herhangi bir ZigZag göstergesinde Yüksek ve Düşük fiyat uçlarının karşılık gelen değerlerinin görüntülenmesi mümkün mü ve mümkünse nasıl,

onlara istikrarlı bir bağlanma ve oluşan tepelere ve alçak alanlara yakınlık sağlamak mı?

OBJ_TEXT örneğine bakın

 

Teşekkür ederim.
Evet, burada yazılan tam olarak bu.

Все объекты, созданные выражением указатель_объекта= new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete (указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete , то об этом будет выведено сообщение в журнал "Эксперты" . 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new . Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete .

Bu bir hata değil, bir kısır döngü ile sonuçlanan böyle bir özellik anlamına gelir.
Dinamik bir nesneyi silme işlemini otomatikleştirmek istersem, o zaman yıkıcı yalnızca delete üzerinde çağrılır, bu nedenle yıkıcının kendisine delete koymak işe yaramaz.
Ancak @A100'ün burada önerdiği gibi otomasyon başka bir sınıfın başka bir örneği aracılığıyla uygulanabilir.

 
aleger :

Bahşiş için teşekkürler. Zaten zamayalsya okuyun ve deneyin, deneyin ve okuyun. ZigZag ile çalışan bir örnek görmek istiyorum...

Avatarımda zikzaklı, ancak üst uçların DOĞRU bağlanmasıyla olduğu gibi, çünkü her şey alttakilerin bağlanmasıyla uyumludur!

k=(WindowPriceMax()-WindowPriceMin())/30 aracılığıyla bağlama yöntemi, pencere boyutundaki büyük değişikliklerle kendini haklı çıkarmaz, başka bir şeye ihtiyaç duyulmalıdır...


örnekte   OBJ_TEXT ve üst ve alt bağlantı. Bağlantıyı takip edin, örneği çalıştırın ...

 
Nikolai Semko :

Bu bir hata değil, bir kısır döngü ile sonuçlanan böyle bir özellik anlamına gelir.

Ayrılan yönetilmeyen kaynaklar üzerindeki denetimi çözmenin yolunun akıllı işaretçiler kullanmak olduğu daha önce size söylenmişti. C++ ile tam analoji.
Belki de sorun, çözümün gümüş tepside sunulmamış olmasıdır, kusura bakmayın...


Herkes "shared_ptr" sitesi aramasında puan verebilir ve ilk sonuca gidebilir, zor değil, denemenizi şiddetle tavsiye ederim.