Hatalar, hatalar, sorular - sayfa 2362

 
Ilya Malev :

Orada hiçbir işlevim yok, ancak tam olarak tanımladığınız görev çözülüyor. CNode listesinin temel sınıfına sahibim (yöntemlerin Prev (), Next (), vb. olduğu) ve döngüde ardılı olan COorder alanlarına bir çağrı var. Döngü, 1 kez tanımlı olarak bildirilir ve ardından her yerde kullanılır.

görünüşe göre haklısın, senin örneğine göre yapmaya çalıştım ama yine de typedef kullanmak istiyorum

 #property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 ) { }   
  };
  
typedef CMyclass (*PtrCMyclass)(CObject*); 
PtrCMyclass Myclass;
//+------------------------------------------------------------------+
void OnStart ()
  {
   CList *base= new CList;
   for ( int i= 0 ;i< 3 ;i++)
     {
      base.Add( new CMyclass);
      Myclass(base.GetCurrentNode()).x = 99 ;
      Myclass(base.GetCurrentNode()).y = - 555.5 ;
     }
   for ( int i= 0 ;i< 3 ;i++)
     {
       Print (Myclass(base.GetNodeAtIndex(i)).x, " : " ,Myclass(base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

şimdi derleyici benim örneğimi atlıyor, ama bir yerde ihtiyacı var ... bir şeye ihtiyaç var ... ama ne? yürütürken bir hata alıyorum:

'tst_file.mq4' (30,7) içinde geçersiz işlev işaretçisi çağrısı


 
Igor Makanu :

görünüşe göre haklısın, senin örneğine göre yapmaya çalıştım ama yine de typedef kullanmak istiyorum

şimdi derleyici benim örneğimi atlıyor, ama bir yerde ihtiyacı var ... bir şeye ihtiyaç var ... ama ne? yürütürken bir hata alıyorum:

'tst_file.mq4' (30,7) içinde geçersiz işlev işaretçisi çağrısı


Yani bir fonksiyon yazmanız ve onu bir işaretçiye atamanız gerekiyor)))

 typedef CMyclass* (*PtrCMyclass)(CObject*);
CMyclass* FMyCast1(CObject*p){ CMyclass *r = dynamic_cast <CMyclass*>(p); if ( CheckPointer ( r ) != POINTER_INVALID ) return r; else return NULL ; }
PtrCMyclass Myclass = FMyCast1;
 
Ilya Malev :

Yani bir fonksiyon yazmanız ve onu bir işaretçiye atamanız gerekiyor)))

hmm, mantıklı, ancak işlevi şu şekilde yazarsam, sınıf alanlarına erişmek için koymak için bir nokta vermez:

PtrCMyclass Sınıfım( CObject* nesne){ return(GetPointer(obj)); };

'x' - yapı veya sınıf türü bekleniyor tst_file.mq4 otuz 38


 
Yukarıda yazdığım gibi deneyin. Typedef burada gerçekten gerekli olmasa da, kod ile işlev çağrısı arasında fazladan bir "pad" olduğundan. Aynı işaretçiyi kullanarak başka bir sınıf için bu çağrıyı yine de aşırı yükleyemezsiniz. Her sınıf için yeni bir tane yapmamız gerekecek. Typedef'lerin tamamen işe yaramaz olmaktan biraz daha az olduğunu anlamanın zamanı geldi, IMHO :)
 
Igor Makanu :

((CMyclass*)base.GetNodeAtIndex(i))).x

 
Ilya Malev :
Yukarıda yazdığım gibi deneyin. Typedef burada gerçekten gerekli olmasa da, kod ileişlev çağrısı arasında fazladan bir "pad" olduğundan. Aynı işaretçiyi kullanarak başka bir sınıf için bu çağrıyı yine de aşırı yükleyemezsiniz. Her sınıf için yeni bir tane yapmamız gerekecek. Typedef'lerin tamamen işe yaramaz olmaktan biraz daha az olduğunu anlamanın zamanı geldi, IMHO :)

Denedim ama yine de defans ile nasıl çalışacağımı bilmiyorum, bilim karmaşık, bir hata aldım: tst_file EURUSD,H1: 'tst_file.mq4' içinde geçersiz işaretçi erişimi (31.56)

 #property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 ) { }
  };
//+------------------------------------------------------------------+
#define alive(node)  ( CheckPointer (node)== POINTER_DYNAMIC )
#define loopf(type, node)   for (type *o; o=node;)
//+------------------------------------------------------------------+
void OnStart ()
  {
   CList *base= new CList;
   CMyclass *res;
   for ( int i= 0 ;i< 3 ;i++)
     {
      base.Add( new CMyclass);
      loopf(CMyclass,base.GetCurrentNode()){ o.x = 99 ; res.y = 555 ;}
     }

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

((CMyclass*)base.GetNodeAtIndex(i))).x

HURRAH! KAZANDI!!!

Teşekkür ederim!

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 ) { }
  };
//+------------------------------------------------------------------+
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 ;
     }

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

;)

 
Igor Makanu :

Denedim ama yine de defans ile nasıl çalışacağımı bilmiyorum, bilim karmaşık, bir hata aldım: tst_file EURUSD,H1: 'tst_file.mq4' içinde geçersiz işaretçi erişimi (31.56)

Döngüm kütüphane düğümünüzle çalışsaydı çok şaşırırdım)))

Tabii ki son yazımda typedef ile kodu kastetmiştim)))

Igor Makanu :

HURRAH! KAZANDI!!!

Teşekkür ederim!

;)

Gerçekten, neden hemen en bariz olanı denemedin? :) Yani typedef ile aydınlatmak mı istediniz? =)))

 
Ilya Malev :

Gerçekten, neden hemen en bariz olanı denemedin? :) Yani typedef ile aydınlatmak mı istediniz? =)))

Denedim! ancak MQL kullanarak işaretçinin referansını kaldırmanın mümkün olmayacağı kesindi, her şeyin banal olduğu ortaya çıktı - daha fazla parantez koymak gerekiyordu! ))))

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

 
Alexandr Sokolov :

Gösterge hangi nedenlerle yalnızca M1 tablosunda çalışmayabilir, diğerlerinde hatasız çalışabilir? (MQL5). İşte bir fonksiyon - ve M1 grafiğinde 0 verildiğinde, nedense bir değişkeni özetlemiyor


Bu, Open = Close ile bir mum olduğu ve kodun kendisinin çarpık yazıldığı ve 0'a bölme denetimi içermediği anlamına gelir. Bu üzücü durum TF'ye bağlı değildir.