Hatalar, hatalar, sorular - sayfa 2363

 
Igor Makanu :

typedef bir konu, denedim, ama aynı zamanda çok kaba değil, yine de nerede hata yaptığınızı bulmanız gerekiyor, örneğim typedef yardımıyla çalışmalı!

Yukarıda yazdığım kod çalışması gerekir. Kendim kontrol etmek istedim ama şans yok: =))))))))))))


(1961'i inşa et)

 
Igor Makanu :

typedef bir konu, denedim, ama aynı zamanda çok kaba değil, yine de nerede hata yaptığınızı bulmanız gerekiyor, örneğim typedef yardımıyla çalışmalı!

Veya ekstra parantez ve işaretçiler olmadan daha basit ve daha zarif hale getirebilirsiniz - (ve garip hatalar olmadan derlenir))))

 #property strict

class CObject{ };
class CMyclass: public CObject {
   public : CMyclass * operator [] (CObject*p){ CMyclass*r = dynamic_cast <CMyclass*>(p); 
                                 return CheckPointer (r)!= POINTER_INVALID ?r: NULL ; }
           int f(){ return 1 ; } 
} my ;

void OnStart ()
{
  CObject*co= new CMyclass;
  
  my[co].f();
}
 
Ilya Malev :

Veya ekstra parantez ve işaretçiler olmadan daha basit ve daha zarif hale getirebilirsiniz - (ve garip hatalar olmadan derlenir))))

örneğiniz benim durumumda çalışmayacak, nesnelerim dinamik olarak oluşturuldu, onlara bir isim bile vermiyorum ve örneğin işaretçi adına atıfta bulunarak, şöyle denedim, derleyici atlamıyor: '[ ' - isim bekleniyor tst_cast.mq4 32 on beş


 #property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   CObject           *obj;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 )  {                       }
   public : CMyclass * operator [] (CObject*p){ CMyclass*r = dynamic_cast <CMyclass*>(p); 
                                             return CheckPointer (r)!= POINTER_INVALID ?r: NULL ; }         
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CList *base= new CList;
   for ( int i= 0 ;i< 3 ;i++)
     {
      base.Add( new CMyclass);
      ((CMyclass*)base.GetCurrentNode()).x = 99 ;
      ((CMyclass*)base.GetCurrentNode()).y = 555 ;
        CMyclass[base.GetCurrentNode()].x = 111 ;
     }

   for ( int i= 0 ;i< 3 ;i++)
     {
       Print (((CMyclass*)base.GetNodeAtIndex(i)).x, " : " ,((CMyclass*)base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

Not: Ne teklif ettiğinizi biraz anlamaya başladım ama yine de bir sonuç yok, dynamic_cast <> olmadan da yapabilirsiniz, * CObject alanını ekleyin, teorik olarak şöyle olmalı:

...
 CObject           *obj;
 CMyclass          * operator [](CObject*p)        { obj = p; return (obj); }          
  };

Dinamik_cast <> ile verdiğiniz örnekten biraz daha hızlı çalışacağını düşünüyorum - anlam aynı görünüyor

 
Igor Makanu :

MQL'de *CObject işaretçisinin referansını kaldırmak mümkün mü?

Farklı seçenekler denedim, işte testin scripti, bağlantılı listeye 3 Myclass elemanı ekliyorum ve ardından CMyclass alanlarının değerlerini değiştiriyorum, bu şekilde çalışıyor:

ara CMyclass *sonuç işaretçisi olmadan dinamik olarak oluşturulmuş CMyclass öğelerinin kenar boşluklarını değiştirebilir miyim?

bunun gibi bir şey: (CMyclass *)(base.GetCurrentNode()).x = 99;

Not: typedef'in kullanılması gerektiğinden şüpheleniyorum, ancak şu ana kadar şans yok

Yazdıklarınız, aynı şeyin örtülü bir kullanımıdır:

result=base.GetCurrentNode();

Onlar. böyle anonim bir işaretçi, ama aslında sadece sözdizimsel şeker. MQL'de neredeyse hiç şeker yoktur, bu yüzden bu şekilde yapamazsınız. Ancak, bir çocuğa tür indirgemenin herhangi bir kontrol ve dönüşüm olmadan gerçekleştiğini, bu nedenle çok hızlı olduğunu, bu nedenle bir işaretçiyle açık çalışmanın sizi neden bu kadar memnun etmediği tam olarak açık değil.

 
Igor Makanu :

Not: Ne teklif ettiğinizi biraz anlamaya başladım ama yine de bir sonuç yok, dynamic_cast <> olmadan da yapabilirsiniz, * CObject alanını ekleyin, teorik olarak şöyle olmalı:

Dinamik_cast <> ile verdiğiniz örnekten biraz daha hızlı çalışacağını düşünüyorum - anlam aynı görünüyor

Yukarıda yapmanız önerildiği gibi, ayrı bir alan olmadan, yalnızca bir operatördeki bir sarmalayıcı aracılığıyla mümkündür.

Bir fark var, küçük bir tane. Birdenbire sınıfıma dönüştürülemeyen bir nesne olduğu ortaya çıkarsa, dynamic_cast olmadan bir çalışma zamanı hatası olacaktır ve bununla birlikte - dönüşte sadece NULL. Bu, .x üzerinden hemen erişilmesi şartıyla, her durumda bir runtime hatasına neden olur, bu yüzden endişelenmenize gerek yok =)))

Tam olarak "doktorun emrettiği" gibi yaparsanız, NULL durumunda, bu hatayı işlemek için oluşturulan sınıfın özel bir örneği gibi bir şey döndürmeniz gerekir)))

not Son zamanlarda normal bir oyuncu kadrosuna kıyasla dynamic_casta'nın hızını kontrol ettim - beklenene bir sınıf eşitliği durumunda gibiydi, neredeyse aynı.

not Her durumda, for'lar orada oldukça üzgün görünüyor - listelerle çalışırken, her biri için olduğu gibi döngüler kullanmanız gerekir (döngüm gibi)
 
Igor Makanu :

derleyiciyi atlamaz: '[' - ad bekleniyor tst_cast.mq4 32 on beş

 #property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   CObject           *obj;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 )  {                       }
   public : CMyclass * operator [] (CObject*p){ CMyclass*r = dynamic_cast <CMyclass*>(p) ; 
                                             return CheckPointer (r)!= POINTER_INVALID ?r: NULL ; }         
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CList *base= new CList;
   for ( int i= 0 ;i< 3 ;i++)
     {
      base.Add( new CMyclass);
      ((CMyclass*)base.GetCurrentNode()).x = 99 ;
      ((CMyclass*)base.GetCurrentNode()).y = 555 ;
        CMyclass[base.GetCurrentNode()].x = 111 ;
     }

   for ( int i= 0 ;i< 3 ;i++)
     {
       Print (((CMyclass*)base.GetNodeAtIndex(i)).x, " : " ,((CMyclass*)base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

...

Aslında, bu ambalajla ne aldın? Orada tamamen gereksiz olduğunda ekstra bir dynamic_cast? Sarmalayıcının kendisinde, aynı CMyClass'a açık bir dönüşüm. Onlar. içindeki iş yükü %0'dır ve kod daha kafa karıştırıcıdır (dizin erişim operatörü, geçirilen sınıfın açık bir döküm operatörü olarak kullanılır - peki, hiç açık değil).

 
Ilya Malev :
not Her durumda, for'lar orada oldukça üzgün görünüyor - listelerle çalışırken, her biri için olduğu gibi döngüler kullanmanız gerekir (döngüm gibi)

Üzgünüm ama bu saçmalık.

 
Vasiliy Sokolov :

Yazdıklarınız, aynı şeyin örtülü bir kullanımıdır:

Onlar. böyle anonim bir işaretçi, ama aslında sadece sözdizimsel şeker. MQL'de neredeyse hiç şeker yoktur, bu yüzden bu şekilde yapamazsınız. Ancak, bir çocuğa tür indirgemenin herhangi bir kontrol ve dönüşüm olmadan gerçekleştiğini, bu nedenle çok hızlı olduğunu, bu nedenle bir işaretçiyle açık çalışmanın sizi neden bu kadar memnun etmediği tam olarak açık değil.

evet, tüm bunları anlıyorum, işaretçilerle çalışırken MQL'deki sözdizimini çözemiyorum, her şey standart C++ ile aynı görünüyor, ancak sürekli kafam karışıyor ve hemen yazamıyorum veya okuyamıyorum MT'nin standart teslimatından aynı kütüphanenin kodu .... Zaten tüm saçımı çıkardım! ... ama hala .op'ta! )))) - Yine de çözeceğim;)


İlya Malev :

Bir fark var, küçük bir tane. Birdenbire sınıfıma dönüştürülemeyen bir nesne olduğu ortaya çıkarsa, dynamic_cast olmadan bir çalışma zamanı hatası olacaktır ve bununla birlikte - dönüşte sadece NULL. Bu, .x üzerinden hemen erişilmesi koşuluyla her durumda bir hataya neden olacaktır.

bunların hepsi açık ve bu küçük bir fark değil, önyargısız olarak profesyonel bir programcının kodunun amatör bir koddan tam olarak bu farkla - kritik hataları kontrol etmede - farklı olduğunu söyleyeceğim .... programlama dillerindeki modern eğilimlerle birlikte bu, nihayet, vb. dışında try'ı kullanan lamerler - programcılar için basitleştirilmiştir. ;)

 
Vasiliy Sokolov :

Üzgünüm ama bu saçmalık.

Evet lütfen

 
Igor Makanu :

evet, tüm bunları anlıyorum, işaretçilerle çalışırken MQL'deki sözdizimini çözemiyorum, her şey standart C++ ile aynı görünüyor, ancak sürekli kafam karışıyor ve hemen yazamıyorum veya okuyamıyorum MT'nin standart teslimatından aynı kütüphanenin kodu .... Zaten tüm saçımı çıkardım! ... ama hala .op'ta! )))) - Yine de çözeceğim;)

MQL durumunda C++'ı kılavuz olarak almak işe yaramaz :) MQL'de imkansız olanın hacmi, "uyumlu" yapıların hacminden çok daha büyüktür. IMHO, MQL daha çok sözdizimsel şeker içermeyen çok soyulmuş bir C# gibidir.