Hatalar, hatalar, sorular - sayfa 1856

 
Andrey Dik :

kodlamayı nasıl görebilirim
Bir üçüncü taraf düzenleyicide metin türünü değiştirerek değiştiğini öğrendim, ancak hangi kodlamayı nasıl bulacağımı bilmiyorum.
Andrey Khatimliansky :
ME 1580'de bir EA oluşturdu : Win-1251 (ANSI)

Evet, Akepadom, eski dosyalar UTF-16LE 1200'e sahipken, kodlamanın Win-1251 (ANSI) olduğunu görür.

Bu, yeni dosyalar için varsayılan kodlamanın değiştiği anlamına mı geliyor?

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2017.04.14 11:40

Evet, sahtekar komisyoncular. Hala negatif sayıları oraya doldururlardı.

Brokerler semboller oluşturduğunda geliştiricilerin her parametre için olası değer aralığı üzerinde bir sınırı olsaydı iyi olurdu.

 

Marketten ürünleri güncellerken bu ürünün grafiklerdeki tüm ayarlarının varsayılan ayarlara sıfırlandığını fark ettim.

Bu yanlış. nasıl önlenir?

 

ArrayMaximum() ve ArrayMinimum() - geçirilen parametrelerin sırası yardımla eşleşmiyor:


 
fxsaber :
Küçük bir hack. Atama atlama

Sonuç

Bu bir hayat kesmek değil, bir sapıklıktır.

Bunu senden beklemiyordum.

 
Koldun Zloy :

Bu bir hayat kesmek değil, bir sapıklıktır.

Bunu senden beklemiyordum.

O zaman bu senin için

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Kitaplıklar: TypeToBytes

fxsaber , 2017.04.13 13:34

Bu özelliğin olası hataları belirlemek için nasıl yararlı olabileceğine dair bir örnek.

Senaryoyu yazıp çalıştırıyoruz.

 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
  STRUCT() : i( 0 ) {}
  
   template < typename T>
   void operator =( T& ) {}
};

#define PRINT(A) :: Print ( #A + " = " + ( string )(A));

void OnStart ()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


Sonuç.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

Bu size atama operatörünün bir yapıyı aynı türdeki bir yapıya kopyalamayacağını söyler.


Yapıya daha fazlasını eklerseniz,

   void operator =( STRUCT &Value ) { this .i = 0 ; }

o zaman sonuç aynı olacaktır.


Görünüşe göre bu operatörü düzelterek

   void operator =( STRUCT &Value ) { this .i = Value.i; }

her şey doğru olmalı, ancak kütüphane aksini söylüyor.


Belki de bu örneğin en ince noktası budur.

düzeltiyoruz

 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
  STRUCT() : i( 0 ) {}
  
   template < typename T>
   void operator =( T& ) {}

   void operator =( const STRUCT &Value ) { this .i = Value.i; }
};

#define PRINT(A) :: Print ( #A + " = " + ( string )(A));

void OnStart ()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

ve sonucu al

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


Artık kopyalama operatörü doğru yazılmıştır!

Benzer şekilde, herhangi bir basit yapının atama/kopyalama operatörlerinin doğruluğunu kontrol edebilirsiniz.

 

1. Şu şekilde yazdığımızda:

STRUCT StructCopy1 = Struct;
operatör= yerine, kopya oluşturucu çağrılmalıdır.

Bununla birlikte, bu daha çok Metaquotes için bir sorudur.

2. Derleyici tarafından oluşturulan kopya kurucu çağrılmamışsa, onu kendimiz yazabiliriz.

 struct STRUCT
{
   int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
   void operator =( const STRUCT& )
  {
     this .i = 5 ;
  }
};

Şimdi operatör= çağrılmaz.

3. Yapının üyeleri bizim için mevcut olduğundan, basitçe şunu yazabiliriz:

StructCopy1.i = Struct.i;

Onları özel yaparsanız, yaşam hack'iniz de yardımcı olmaz.

4. Ve en önemlisi: operatör=, tüm atamaların etrafından değil, üzerinden geçmesi için yapılır.

Genellikle, onunla birlikte bir kopya kurucu da tanımlanır.

Evet. Örneğe baktı. pek faydasını görmedim.

 
Koldun Zloy :

1. Şu şekilde yazdığımızda:

operatör= yerine, kopya oluşturucu çağrılmalıdır.

Bununla birlikte, bu daha çok Metaquotes için bir sorudur.

2. Derleyici tarafından oluşturulan kopya kurucu çağrılmamışsa, onu kendimiz yazabiliriz.

Şimdi operatör= çağrılmaz.

3. Yapının üyeleri bizim için mevcut olduğundan, basitçe şunu yazabiliriz:

Onları özel yaparsanız, yaşam hack'iniz de yardımcı olmaz.

4. Ve en önemlisi: operatör=, tüm atamaların etrafından değil, üzerinden geçmesi için yapılır.

Genellikle, onunla birlikte bir kopya kurucu da tanımlanır.

Evet. Örneğe baktı. pek faydasını görmedim.

Life hack ayrıca kopya oluşturucuyu da atlar. Ve fayda burada
 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2 ;
  }
  
   void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
     this .i = 5 ;
  }
};

void OnStart ()
{
  STRUCT Struct( 1 );  

   ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;   // STRUCT( const STRUCT& )

   ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

   ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_R evrensel bir şeydir. Bu nedenle, kendi operatörleri olan yabancı yapıların yeniden tanımlanmasına gerek yoktur.

 #include <TypeToBytes.mqh>

struct STRUCT
{
   int i;
  
   void operator =( const STRUCT& )
  {
     this .i = 5 ;
  }
};

void OnStart ()
{
  STRUCT Structs[] = {{ 1 }, { 2 }};
  
   ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik :

Evet, Akepadom, eski dosyalar UTF-16LE 1200'e sahipken, kodlamanın Win-1251 (ANSI) olduğunu görür.

Bu, yeni dosyalar için varsayılan kodlamanın değiştiği anlamına mı geliyor?

Hayır, her zaman Win-1251 (ANSI) vardı ve bir noktada UTF eklendi. Ancak yalnızca ansi olmayan karakterler içeren kaynaklar için.
 
Andrey Khatimlianskii :
Hayır, her zaman Win-1251 (ANSI) vardı ve bir noktada UTF eklendi. Ancak yalnızca ansi olmayan karakterler içeren kaynaklar için.
Açık. Teşekkür ederim.