Hatalar, hatalar, sorular - sayfa 2296

 
A100 :

Sorun yok... Bir hata var. Ayrıca neden kulaktan kulağa bir açıklama getirmeye çalıştığını da anlamıyorum. Normal Baskı aşağıdaki imzaya sahiptir:

ve ayrıca diğer işlevlerle nasıl çelişeceğini bilir (gerekirse)

Print imzası, MQL5 dilinin yeteneklerinin ötesine geçer. MQL5, Yazdırma aşırı yüklemelerini kesinlikle yasaklıyorsa, bu bir hata olmayacaktır.

Umarım bu "hata" bir araç yaratmanızı engellemez ve koltuk değneği yazmanızı gerektirmez.

 

Test Cihazının performansını ölçtü. Bunu yapmak için her kene üzerinde bir pozisyon açıp kapattım. 100 tik yürütme süresini ölçtüm. Ve böylece 100.000 kene sürdü. Toplam 1000 ölçüm. Bu çizelgeyi aldım

Aralarında neredeyse aynı mesafede bazı yavaşlama patlamaları. Optimizasyon modunda ölçülmüştür. Patlamalara dikkat etmezseniz, Test Cihazının performansı sabit bir değer yerine %25 dans eder. Belki de bu yine Windows'ta bir hız ölçümü şakasıdır.


Tehdit MT4'te başlatılan aynı kod

Ortalama olarak, MT4-Tester bir onay işlemek için MT5'e göre 1,5-2 kat daha az zaman harcar.

Dosyalar:
Tester.mq5  2 kb
 

Belki de bir genetik optimizasyon algoritmasının kullanılmasıyla ortaya çıkar.


... her tikte bir pozisyon açıp kapattı.

Ortalama olarak, MT4-Tester bir onay işlemek için MT5'e göre 1,5-2 kat daha az zaman harcar.
Ve bu saf manipülasyon ve yanlış beyandır.
 
Sergey Dzyublik :

Belki de bir genetik optimizasyon algoritmasının kullanılmasıyla ortaya çıkar.

GA değildir. Bir Aracıda iki geçişten optimizasyon.

Ve bu saf manipülasyon ve yanlış beyandır.

Kaynak yerinde.

 

Biri uyarı, diğeri hata.

 void f()
{
     for ( int i = 0 ;; )
    {
        Print ( i );
         int     i = 5 ; //Warning: declaration of 'i' hides local declaration
         Print ( i );
         break ;
    }
}
void For( int i = 0 )
    {
         Print ( i );
         int     i = 5 ; //Error: redefinition of formal parameter 'i'
         Print ( i );
    }

Ve temel fark nedir? Örneğin C++'da her iki durumda da hata şudur:

 

Bilgili kişilerin sınıf örneklerine işaretçiler konusunu anlamalarına yardımcı olmak istiyorum. Sonra girmiyorum.

Örnek bir komut dosyamız var:

 class A
  {
public :
                     A() { Print ( "Start" ); };
                    ~A() { 
                     Print ( "End" ); 
                     Print ( EnumToString ( CheckPointer ( GetPointer ( this )))); 
                     if ( CheckPointer ( GetPointer ( this ))!= POINTER_DYNAMIC ) 
                     delete GetPointer ( this );};
  };
  
A a;

void OnStart ()
  {
  }

Yürütüldüğünde, beklendiği gibi elimizde:

 2018.09 . 23 21 : 56 : 20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 56 : 20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09 . 23 21 : 56 : 20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


bunun gibi bir sınıfın örneğini bildirirsek:

A *a= new A;

sonra yürütüldüğünde elimizde:

 2018.09 . 23 21 : 46 : 42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 46 : 42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09 . 23 21 : 46 : 42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09 . 23 21 : 46 : 42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

onlar. yıkıcı başlatılmaz bile, bellek buna göre serbest bırakılmaz.


Böyle bir sınıfın bir örneğini bildirirsek:

A a= new A;

daha sonra yapıcı iki kez, yıkıcı 1 kez çalıştırılır, ancak bellek serbest bırakılmaz ve POINTER_AUTOMATIC nesne işaretçi türüne sahibiz, ancak POINTER_DYNAMIC bekleniyordu

 2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09 . 23 21 : 54 : 24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09 . 23 21 : 54 : 24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09 . 23 21 : 54 : 24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


Yıkıcının her zaman yürütülmesi ve silme işleminin doğru şekilde yürütülmesi nasıl sağlanır?

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


C++'dan akıllı işaretçiler konusuna bakın ve MQL'ye uyum sağlayın ( https://habr.com/post/140222/ ).
Belki kod tabanında bir şey ...

 
Sergey Dzyublik :


C++'dan akıllı işaretçiler konusuna bakın ve MQL'ye uyum sağlayın ( https://habr.com/post/140222/ ).
Belki kod tabanında bir şey ...

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.

 
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.

Sonra şöyle deneyin:
 class A { public :
         A() { Print ( 1 , ":" , EnumToString ( CheckPointer ( GetPointer ( this )))); }
        ~A() { Print ( 2 , ":" , EnumToString ( CheckPointer ( GetPointer ( this )))); }
};
class B { public :
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
         void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart () {}

Sonuç:

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

 
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.

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