Hatalar, hatalar, sorular - sayfa 2661

 
Nikolai Semko :

Kodu en aza indirdiğim için özür dilerim, özellikle bazı yanlışlıklar ortaya çıkardı:
- fonksiyona iletilen nesnelerin boyutu aynı (kod güncellendi);
- aptal çıktı yerine printf("1");/printf("2"); aslında, arayüze veya nesnenin iç kısımlarına erişim doğrudan gerçekleştirilir, bu da iki algoritmayı tek bir çağrı işlevinde sıraya koymayı mümkün kılmaz (kod güncellenir).

 
Sergey Dzyublik :

Kodu en aza indirdiğim için özür dilerim, özellikle bazı yanlışlıklar ortaya çıkardı:
- fonksiyona iletilen nesnelerin boyutu aynı (kod güncellendi);
- aptal çıktı yerine printf("1");/printf("2"); aslında, arayüze veya nesnenin iç kısımlarına erişim doğrudan gerçekleştirilir, bu da iki algoritmayı tek bir çağrı işlevinde sıraya koymayı mümkün kılmaz (kod güncellenir).

 class C{
public :
   struct A{
   public :
       char aaa;
      
      A ( char value = 0 ) : aaa( value ){}
       void set ( char value ){
         aaa = value ; 
      };
       uint Type(){ return 0x778F6712 ;}
       char get (){ return aaa;}
       A Get() { return this ;}
   };
   
   void test(A&, A& a1, A& a2){
      printf( "1" );
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
       if (a.Type()== d1.Type()) test(a,d1.Get(),d2.Get());
       else {
      printf( "2" );
      d1. set (d2. get ());}
   }
};

struct B : public C::A{};


struct D{
private :
   char data;
public :  
   D( char value = 0 ) : data( value ){}
   void set ( char value ){
      data = value ; 
   };
   uint Type(){ return 0x308FD7FE ;}
   char get (){ return data;}
   D Get() { return this ;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b, b, b);     // 1      should be: 1
   c.test(b, d, d);     // 2      should be: 2   
}


veya bunun gibi:

 class C{
public :
   struct A{
   public :
       char aaa;
      
      A ( char value = 0 ) : aaa( value ){}
       void set ( char value ){
         aaa = value ; 
      };
       char get (){ return aaa;}
       A Get() { return this ;}
   };
   
   void test(A&, A& a1, A& a2){
      printf( "1" );
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
      printf( "2" );
      d1. set (d2. get ());
   }
};

struct B : public C::A{};


struct D{
private :
   char data;
public :  
   D( char value = 0 ) : data( value ){}
   void set ( char value ){
      data = value ; 
   };
   char get (){ return data;}
   D Get() { return this ;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b .Get() , b .Get() , b .Get() );     // 1      should be: 1
   c.test(b .Get() , d .Get() , d .Get() );     // 2      should be: 2   
}
 
çözüm için teşekkürler
kullanılan nesnelerin yapısında değişiklikler gerektirdiği ve mantığı bulaştırdığı için ideal değildir, ancak çalışır.

Ve evet, test üzerinde bir sarmalayıcı işlevi yapmak daha iyidir:
   template < typename T>
   void test(A& a, T& t1, T& t2){ 
      __test(a, t1.CastToMain(), t2.CastToMain());
   }
Projedeki tüm aramalar nasıl aranır:
   c.test(b, b.CastToMain(), b.CastToMain());     // 1      should be: 1
   c.test(b, d.CastToMain(), d.CastToMain());     // 2      should be: 2  
Her durumda, yardımın için çok teşekkürler.
 
Sergey Dzyublik :
çözüm için teşekkürler
kullanılan nesnelerin yapısında değişiklikler gerektirdiği ve mantığı bulaştırdığı için ideal değildir, ancak çalışır.

Ve evet, test üzerinde bir sarmalayıcı işlevi yapmak daha iyidir:
Projedeki tüm aramalar nasıl aranır:

Her durumda, yardımın için çok teşekkürler.

Evet katılıyorum

 

Şablon işlevi/sınıf önbelleğindeki kusurlar:
(MT5(build 2345) tarafından sabitlenmedi ) ** Tanımsız Davranış, "C" dahili tipine sahip karmaşık, çoklu sarılmış bir nesne yaratırsınız ve orada tamamen farklı bir veri tipi olduğu ortaya çıkar, belki "B", belki " int", ne istersen...
(MT5(build 2345) tarafından düzeltilmedi ) * Derleme Hatası, fonksiyon işaretçi argümanını const ref şablonu olarak geçirirken oluşan hata.
( MT5(build 2345 tarafından düzeltilmedi )) * Derleme Hatası, bir B<int> nesnesi bir B<void*> nesnesinden sonra oluşturulabilir, ancak daha önce yapılırsa bir derleme hatası oluşur.


Şablon işlevinin/sınıfının çalışmasındaki kusurlar:
(MT5(build 2345 tarafından düzeltilmedi )) ** Derleme Hatası, bir şablon işlevi içindeki bir hata, açık bir döküm işleminin parçası olarak geçirilen bir işaretçi, diğer durumlarda bir sınıf gibi davranır - bir işaretçi gibi.
(MT5(build 2345) tarafından düzeltilmedi ) ** Derleme Hatası, dahili sınıf kullanılırken şablon sınıfı kod oluşturma hatası.
(MT5(build 2345) tarafından düzeltilmedi ) ** Derleme Hatası, şablon işlevinin şablon parametresi için dahili sınıfa erişmeye çalışırken oluşan hata.
(MT5(build 2345) tarafından düzeltilmedi ) * Derleme Hatası, bir şablon yöntemi/sınıfı oluşturulurken oluşan hata, bir şablon parametresinin "otomatik olarak değiştirilmesi" süreci, ana program koduna kapsamın ötesine geçer.
(MT5(build 2345) tarafından düzeltilmedi ) * Derleme Hatası, şablon sınıfı şablon yöntemi için dönüş değeri olarak hareket ettiğinde şablon sınıfı kodunun otomatik olarak üretilmemesi hatası.
( MT5(build 2345) tarafından düzeltilmedi ) * Derleme Hatası, dahili sınıf tanımlanırken hata - temel sınıf belirtilirken genel ad alanına açıkça başvurmak mümkün değildir.
( MT5(build 2345 tarafından düzeltilmedi )) *(yeni) Derleme Hatası, bir dahili yapıyı bir şablon işlevine geçirirken oluşan hata, sonuçtaki veri türü , şablon sınıfındaki başka bir dahili yapı için temel veri türü olarak kullanılamaz.
(MT5(build 2345 tarafından düzeltilmedi )) *(yeni) Derleme Hatası, çağrı aşırı yüklenmiş şablon olmayan bir işlevden yapıldığında açık argüman türleriyle bir şablon işlevi çağrılırken oluşan hata.


C++ ile karşılaştırıldığında MQL'de aşırı yüklenmiş işlev çağrılarının önceliklerinin uyumsuzluğundaki kusurlar:
( MT5(build 2345) tarafından düzeltilmedi ) *** Derleme Hatası, A <= B <= C <= D sınıflarının kalıtımı olduğunda ve iki aşırı yükleme işlevi uygulandığında, örneğin biri A* parametresiyle ve ikincisi B* ile, ardından MQL'de bir C* veya D* nesnesinin böyle bir işlevine geçiş, "aşırı yüklenmiş işleve belirsiz çağrı" derleme hatasına neden olur.
(MT5(build 2345) tarafından düzeltilmedi ) ** Çalışma zamanı, Aşırı yüklenmiş şablon işlevlerine yapılan çağrılar için öncelik uyuşmazlığı.
( MT5(build 2345 tarafından düzeltilmedi )) **(yeni) Derleme Hatası, aşırı yüklenmiş şablon işlevlerine yapılan çağrıların önceliği aslında şablon parametresinin türüne bağlıdır, bu teorik olarak derleme sonucunu hiçbir şekilde etkilememelidir .
( MT5(build 2345 tarafından düzeltilmedi )) **(yeni) Derleme Hatası, şablon işlev kodu oluşturulurken, geçirilen parametreler için uygun bir imzaya sahip aşırı yüklenmiş bir şablon işlevi olmasına rağmen bir derleme hatası oluşuyor.



Teklifler:
link - değişmez değerleri ve geçici değişkenleri const ref işlev argümanları olarak iletme yeteneği sağlama hakkında.
bağlantı - "Proje" sekmesindeki proje dosyalarını taşırken, açık olan ve ME sekmelerinde bulunan dosyaları taşımak için konum yollarını otomatik olarak günceller.
link - MQL typedef bildirimine işlevsellik ekleme ihtiyacı hakkında.
bağlantı - varsayılan kopya oluşturucuların ve atama operatörlerinin oluşturulmasını zorlama yeteneği sağlama hakkında.

 

Sergey Dzyublik :
Спасибо за вариант решения

geçici bir kopya referans yoluyla iletilir, bu nedenle yapıyı değiştirmek işe yaramaz

 
Andrei Trukhanovich :
geçici bir kopya referans yoluyla iletilir, bu nedenle yapıyı değiştirmek işe yaramaz

Genel olarak haklısın...
Ancak özelde - orada her şey çok daha karmaşıktır ve gerçekte verilen yapılar yineleyici işaretçilerdir ve değişen içerikleri değil, atıfta bulundukları nesnelerdir.
Bu nedenle, belirli durumlarda, minnettarlığın ifade edildiği sorun çözülür.

 
MT5 hatası (derleme 2345), nesne bir şablon sınıfı/yapısı olduğunda "yerinde oluşturulan" nesnenin döndürülmesiyle ilişkili birçok kusur:

 class A{
public :
   A( int , int , int ){};  
   A( const A&){}
   A( const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A( 1 , 2 , 3 );               //OK
};

A test_a_class_class(){
   return A( 1 , 2 , 3 );                //OK
};

A test_a_ptr_class(){
   return &A( 1 , 2 , 3 );               //OK
};


template < typename T>
class B{
public :
   B( int &){}
   B( long ){}
   B( int , int , int ){};  
   B( const B&){}
   B( const A*){}
};

// template class type
B<A*> test_b_class_class(){
   B<A*> b( 1 );
   int x = 22 ;
   
   return B<A*>();               // Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"
   return B<A*>( 1 , 2 , 3 );         // Compile Error: only one argument is acceptable, argument should be castable to int
   return B<A*>(x);             // Compile Error: argument is passed by value instead of by reference.
   return B<A*>((A*) NULL );       // Compile Error: 'int' - invalid cast operation         
   return B<B<B< long >>>( 1 );     // Compile Error: OK, template parameter type does not provide any effort on compilation result
   
   return b;
};

B<A*>* test_b_ptr_ptr(){
   B<A*> b( 1 );
   
   return &B<A*>( 1 );             // Compile Error: '&' - illegal operation use
   return &b;                 
};


void OnStart (){ 
   // simple class type
   A* a_ptr = test_a_ptr_ptr();
   A a0 = test_a_class_class();
   A a1 = test_a_ptr_class();
   
   // template class type
   B<A*> b0 = test_b_class_class();
   B<A*>* b_ptr = test_b_ptr_ptr();
}
 

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

Hatalar, hatalar, sorular

Sergey Dzyublik , 2020.03.01 12:53

 class A{
public :
   A( int , int , int ){};  
   A( const A&){}
   A( const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A( 1 , 2 , 3 );               //OK
};

Bu işlevin var olmayan bir nesneye bir işaretçi döndüreceğini doğru anlıyor muyum?

 
fxsaber :

Bu işlevin var olmayan bir nesneye bir işaretçi döndüreceğini doğru anlıyor muyum?

Evet, yukarıdaki örnekte işlev, var olmayan bir nesneye bir işaretçi döndürür.
Bu kodun temel amacı, basit bir sınıf için çalışma işlevselliğinin varlığını ve aynı zamanda bir şablon için gerçek yokluğunu göstermektir.