Hatalar, hatalar, sorular - sayfa 2471

 
Igor Makanu :

Bir CChartObjectLabel oluştururken göstergedeki nesnelerin neden başlatmadan arındırma sırasında silinmediğini aşağıdaki kodda açıklayın:

TF'yi değiştirirken bir günlük girişi alıyorum: 2019.05.23 09:49:02.044 tstlabel EURUSD,M30: CChartObjectLabel türünde 2 nesne kaldı

OnInit()'te metin etiketlerinin ( CChartObjectLabel ) oluşturulmasını iptal ederseniz, her şey doğru şekilde çalışacaktır.

CreateLabel() işlevine bir işaretçi iletiyorum ve sonra bir nedenden dolayı onu OnDeinit() içinde silmek mümkün değil

Yeni bir nesne l oluşturulur. Ve o kaldırılmaz.
 
Artyom Trishkin :
Yeni bir nesne l oluşturulur. Ve o kaldırılmaz.

mantıklı

ancak değişkenlerin kapsamı CChartObjectLabel *LabelUP,*LabelDN; küresel var mı?

böylece kodun herhangi bir bölümündeki değişkeni değiştirebilir miyim?

CreateLabel() işlevine bir işaretçi iletiyorum, neden yeni bir kopya oluşturuyorum?

IMHO, bu doğru çalışmıyor.

Not: OnInit()'te nesneler yaratır ve sonra onlarla CreateLabel()'de çalışırsanız (yani, nesneleri ayrı ayrı oluştururum ve bunlarla işaretçi ile çalışırım), o zaman her şey doğru şekilde çalışır - ama durumu hatırlamıyorum diğer derleyicilerde f-tion'da işaretçiyi aktarmak için yeni bir nesne yarattı - işaretçi o ve Afrika'da işaretçi!

 
Igor Makanu :

mantıklı

ama değişken kapsamım küresel mi? - böylece kodun herhangi bir bölümündeki değişkeni değiştirebilir miyim?

CreateLabel() işlevine bir işaretçi iletiyorum, neden yeni bir kopya oluşturuyorum?

IMHO, bu doğru çalışmıyor.

Yeni bir nesneye bir işaretçi atayarak, yeniden atanan işaretçi tarafından işaret edilen önceki nesneyi kaybederiz.
 
Igor Makanu :

mantıklı

ancak değişkenlerin kapsamı CChartObjectLabel *LabelUP,*LabelDN; küresel var mı?

böylece kodun herhangi bir bölümündeki değişkeni değiştirebilir miyim?

CreateLabel() işlevine bir işaretçi iletiyorum, neden yeni bir kopya oluşturuyorum?

IMHO, düzgün çalışmıyor.

yeni kaldırılmalıdır. Nesneler zaten oradadır ve onlara işaret eder.
 
Artyom Trishkin :
Yeni bir nesneye bir işaretçi atayarak, yeniden atanan işaretçi tarafından işaret edilen önceki nesneyi kaybederiz.

hayır, bir işaretçi bir işaretçidir, MQL'de bir tanımlayıcıdır, mesele bu değil - ancak bir nesnenin yeni bir kopyasını oluşturmak doğru değil, şu anda böyle çalışıyor:

 //+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"
#property strict
#property indicator_separate_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>
CChartObjectLabel *LabelUP,*LabelDN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   LabelUP= new CChartObjectLabel;
   LabelDN= new CChartObjectLabel;
   SetLabel(LabelUP, "LabelUP" , 0 );
   SetLabel(LabelDN, "LabelDN" , 25 );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   delete LabelUP;
   delete LabelDN;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   return (rates_total);

  }
//+------------------------------------------------------------------+
void SetLabel(CChartObjectLabel *l, string name, int y)
  {
   l.Create( 0 ,name, ChartWindowFind (), 0 ,y);
   l.Color( clrYellow );
   l.FontSize( 14 );
   l.Description(name);
  }
//+------------------------------------------------------------------+

ancak mantığınızı takip ederseniz, bu kodda SetLabel () işlevinde l nesnesinin bir kopyası oluşturulacaktır - Bağlantıyı değil işaretçiyi geçtim mi?


Artyom Trishkin :
yeni kaldırılmalıdır. Nesneler zaten oradadır ve onlara işaret eder.

soru, sorunun nasıl çözüleceği değil, neden CChartObjectLabel *LabelUP,*LabelDN değişkeninin global kapsamı ile ; - Kayıp işaretçi!

 
Igor Makanu :

hayır, bir işaretçi bir işaretçidir, MQL'de bir tanımlayıcıdır, mesele bu değil - ancak bir nesnenin yeni bir kopyasını oluşturmak doğru değil, şu anda böyle çalışıyor:

ancak mantığınızı takip ederseniz, bu kodda SetLabel () işlevinde l nesnesinin bir kopyası oluşturulacaktır - Bağlantıyı değil işaretçiyi geçtim mi?

Numara. Burada l, gerekli işaretçiyi içinden geçirdiğimiz yöntemin parametresidir. Burada her şey iyi. Burada işaretçi önceden oluşturulmuş nesne üzerinde kalır. Yeni bir nesne oluşturma ve önceki nesnenin kaybıyla bir işaretçinin yeniden atanması yoktur.
 
Artyom Trishkin :
Numara. Burada l, gerekli işaretçiyi içinden geçirdiğimiz yöntemin parametresidir. Burada her şey iyi. Burada işaretçi önceden oluşturulmuş nesne üzerinde kalır. Yeni bir nesne oluşturma ve önceki nesnenin kaybıyla bir işaretçinin yeniden atanması yoktur.

hala düzgün çalışmıyor

MQL'deki bu "işaretçiler" sınıfın kapsamında çalışmak üzere tasarlanmıştır, bir sınıf oluşturmak istemiyorum, küresel görünürlükte bir işaretçi alıp beyan ediyorum, sonra onu herhangi bir işleve iletiyorum ve içinde bu işlev bir nesne tanımlayıcısı oluşturuyorum, işlevin yerel görünürlüğünü terk ederken nesneyi yok etmek için bir neden yok

şimdi biraz meşgul ama grafiksiz test senaryoları yapmam gerekiyor - aynı sıkıntı olacağını düşünüyorum, eğer fonksiyona POINTER_INVALID değerine sahip bir pointer ile girerseniz, aynı POINTER_INVALID ile çıkacaksınız, evet, her şey olacak doğru çalışın, ancak referans olarak POINTER_INVALID ile bir işaretçiyi geçemeyeceğiniz gibi - işaretçiye erişirken bir hata olacak

 
Igor Makanu :

hala düzgün çalışmıyor

MQL'deki bu "işaretçiler" sınıf kapsamında çalışmak üzere tasarlanmıştır, bir sınıf oluşturmak, küresel görünürlükte bir işaretçiyi delmek ve bildirmek, ardından herhangi bir işleve geçirmek istemiyorum ve bu işlevde yarattığım gerçeği bir nesne tanımlayıcısı, işlevin yerel görünürlüğünü terk ederken nesneyi yok etmek için bir neden yoktur

şimdi biraz meşgul ama grafiksiz test senaryoları yapmam gerekiyor - aynı sıkıntının olacağını düşünüyorum, eğer fonksiyona POINTER_INVALID değerine sahip bir pointer ile girerseniz, aynı POINTER_INVALID ile çıkacaksınız, evet, her şey olacak doğru çalışın, ancak referans olarak POINTER_INVALID ile bir işaretçiyi geçemeyeceğiniz gibi - işaretçiye erişirken bir hata olacak

Sadece nesne yok edilmez. Yöntemin içinde yeni bir nesne oluşturduktan hemen sonra, zaten iki nesnemiz var. Ve yalnızca bir işaretçi var - yönteme resmi bir parametre olarak iletildi. Böylece nesnelerden birine bir işaretçi kaybederiz.
 

Bir şablon işlevine işaretçi ile typedef bildirme olasılığını bulduğuma şaşırdım.
Ancak mutluluk uzun sürmedi.

 template < typename T>
typedef bool (* callback)(T &);

template < typename T>
bool ff(T &){
   return true ;
}

bool ff( int &){
   return true ;
}


void OnStart (){
   int a;
   ff(a);
   
   callback< int > f_ptr_0 = ff;     //'<' - unexpected token     
   callback f_ptr_1 = ff;           //'ff' - function must have a body   
   callback f_ptr_2 = ff< int >;     //'ff<int>' - cannot resolve function address  //'ff<int>' - type mismatch   
}


typedef bir şablon işlevine işaretçi ile planlanmış bir özellik mi?

 
typedef bahçesinde başka bir hata:
 typedef void (* callback)( int &);

template < typename T>
void ff(T &){}


void OnStart (){
   int a = 0 ;
   //ff(a);                     //  если раскомментировать, то работает
   
   callback f_ptr = ff< int >;     //  'ff<int>' - function must have a body
   f_ptr(a);
}

Bir typedef ile çalışırken, açık bir uzmanlığa sahip şablonlu bir işlev kullanmak, şablonlu işlevin oluşturulmasına neden olmaz.