Cevap için teşekkürler, hiç de kötü değilsin) Şimdi belli oldu.) UPD Bu tasarım da işe yarıyor
At() yönteminin ne döndürdüğüne dikkat edin. NULL döndürürse, ölümcül bir hatayla kilitlenir. Bir nesneye bir işaretçi ile erişmeden önce, NULL olmayan bir nesne olup olmadığını kontrol edin.
zaten fark ettim) Yani, çıkış yolu, küresel olarak boş nesneler ilan etmektir .... Ve eğer önceden bilinmiyorsa, kaç tane olacak? Sadece "bir marjla" ilan etmek mi? :) PS Yerleşik yardımda, nesneleri bildirmenin böyle bir yolunu bulamadım
Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi
#include <Arrays\ArrayObj.mqh>
/********************************************************************\
| Класс Новый бар |
\********************************************************************/class CNewBar : public CObject
{
private :
string m_symbol;
ENUM_TIMEFRAMES m_timeframe;
datetime m_time;
datetime Time( void ); // Возвращает время нулевого бараstringSymbol ( void ) { returnthis .m_symbol; }
public :
ENUM_TIMEFRAMES Timeframe( void ) { returnthis .m_timeframe; }
datetime GetTime( void ) { returnthis .m_time; } // Возвращает время последнего обращенияbool IsNewBar( void ); // Основная функция класса
CNewBar( conststring symbol, constENUM_TIMEFRAMES timeframe);
~CNewBar( void ){;}
};
//+------------------------------------------------------------------+//| Конструктор |//+------------------------------------------------------------------+
CNewBar::CNewBar( conststring symbol, constENUM_TIMEFRAMES timeframe) : m_time( 0 )
{
this .m_symbol = symbol;
this .m_timeframe = (timeframe == PERIOD_CURRENT ? Period () : timeframe);
}
//+------------------------------------------------------------------+//| CNewBar Time Возвращает время нулевого бара |//+------------------------------------------------------------------+datetime CNewBar::Time( void )
{
datetime array[ 1 ], ret;
ret = CopyTime ( this .m_symbol, this .m_timeframe, 0 , 1 , array) == 1 ? array[ 0 ] : 0 ;
return (array[ 0 ]);
}
//+------------------------------------------------------------------+//| CNewBar IsNewBar Основная функция класса |//+------------------------------------------------------------------+bool CNewBar::IsNewBar( void )
{
datetime tm = this .Time();
if (tm == 0 )
returnfalse ;
if (tm != this .m_time)
{
this .m_time = tm;
returntrue ;
}
returnfalse ;
}
Ve işte OnInit()'te işaretçiler oluşturma döngüsü
for ( int i = 0 ; i < ArraySize (Rates); i++)
{
CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
if (nb != NULL )
{
list_new_bar.Add(nb);
Print (nb.IsNewBar(), " ***** " , Rates[i].m_Symbols, " ***** " , nb.Time());
}
}
ve OnTimer'da()
voidOnTimer ()
{
int total = list_new_bar.Total();
for ( int i = 0 ; i < ArraySize (Rates); i++)
{
CNewBar* nb = list_new_bar.At(i);
if (nb == NULL )
continue ;
bool new_bar = nb.IsNewBar();
if (new_bar)
{// и дальше………
Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi
Toplama kadar yapardım - sırf Rates dizisinden karakterleri okuduğunuz için (doğru mu?), yeni bar sınıfının örneklerini oluşturun ve bunları listeye ekleyin.
Herhangi bir ekleme hatası için, yeni çubuk sınıfının örneklerine yönelik işaretçi listesinin boyutu Rates dizisinin boyutuyla eşleşmeyecektir.
Genel olarak, şöyle bir şey:
voidOnTimer ()
{
int total = list_new_bar.Total();
for ( int i = 0 ; i < total; i++)
{
CNewBar* nb = list_new_bar.At(i);
if (nb == NULL )
continue ;
if (nb.IsNewBar())
{ // и дальше………
Ve burada listeye eklemenin başarısını da kontrol etmeniz gerekiyor:
for ( int i = 0 ; i < ArraySize (Rates); i++)
{
CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
if (nb != NULL )
{
list_new_bar.Add(nb);
Print (nb.IsNewBar(), " ***** " , Rates[i].m_Symbols, " ***** " , nb.Time());
}
}
şöyle bir şey:
for ( int i = 0 ; i < ArraySize (Rates); i++)
{
CNewBar *nb = new CNewBar(Rates[i].m_Symbols, timefram);
if (nb== NULL )
continue ;
if (!list_new_bar.Add(nb))
{
delete nb;
continue ;
}
Print (nb.IsNewBar(), " ***** " , Rates[i].m_Symbols, " ***** " , nb.Time());
}
listeye yeni bir nesneye bir işaretçi ekleme başarısız olduğunda bellek sızıntılarını önlemek için
Toplama kadar yapardım - sırf Rates dizisinden karakterleri okuduğunuz için (doğru mu?), yeni bar sınıfının örneklerini oluşturun ve bunları listeye ekleyin.
Herhangi bir ekleme hatası için, yeni çubuk sınıfının örneklerine yönelik işaretçi listesinin boyutu Rates dizisinin boyutuyla eşleşmeyecektir.
Genel olarak, şöyle bir şey:
Ve burada listeye eklemenin başarısını da kontrol etmeniz gerekiyor:
şöyle bir şey:
listeye yeni bir nesneye bir işaretçi ekleme başarısız olduğunda bellek sızıntılarını önlemek için
Teşekkür ederim. anladım öyle düzelteyim ... :))))
Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.
if (nb== NULL )
continue ;
ondan nasıl farklı
if (nb!= NULL )
{
}
Başka bir şey, eğer bir hata durumunda, başarısız bir işaretçi silinirse ... Ama burada bile devam etmeden yapabilirsiniz, ki bundan nefret ediyorum; sadece Print()'i kaldırarak. Hata ayıklama ve neler olduğunu anlamaya çalışırken gerekliydi ve işlem sırasında bir hata meydana gelirse, kimse için neyin yanlış olduğunu anlamayacağım ... İşletim sistemini yeniden yüklemek benim için günlükleri anlamaktan daha kolay.
Bunu zaten konuştuğumuz için, lütfen bize vahşilere girmeden, bir işaretçinin bir sınıf değişkeninden nasıl farklı olduğunu ve hangisinin tercih edilebilir olduğunu söyleyin. Anlaşılması zor olan ayrıntılarda, tyrnet'te okuyabilirim. deyim yerindeyse yüzeysel bir anlayış bana yeter...
At() yönteminin ne döndürdüğüne dikkat edin. NULL döndürürse, kritik bir hatayla kilitlenir. Bir nesneye bir işaretçi ile erişmeden önce, NULL olmayan bir nesne olup olmadığını kontrol edin.
Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi
//+------------------------------------------------------------------+//| CNewBar Time Возвращает время нулевого бара |//+------------------------------------------------------------------+datetime CNewBar::Time( void )
{
datetime array[ 1 ], ret;
ret = CopyTime ( this .m_symbol, this .m_timeframe, 0 , 1 , array) == 1 ? array[ 0 ] : 0 ;
return (array[ 0 ]);
}
Alex, böyle ayrıntılı bir cevap için teşekkürler. Yukarıdaki kod parçasında ret değişkeninin amacı net değil... Yöntem yine de dizi[0] döndürürse neden hesaplanır? ZY Bunu neden bir sınıf yönteminde kullanıyorsunuz? Bu özel sınıfın üyeleriyle çalışıyoruz...
Teşekkür ederim. anladım öyle düzelteyim ... :))))
Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.
ondan nasıl farklı
Başka bir şey, eğer bir hata durumunda, başarısız bir işaretçi silinirse ... Ama burada bile devam etmeden yapabilirsiniz, ki bundan nefret ediyorum; sadece Print()'i kaldırarak. Hata ayıklama ve neler olduğunu anlamaya çalışırken gerekliydi ve işlem sırasında bir hata meydana gelirse, kimse için neyin yanlış olduğunu anlamayacağım ... İşletim sistemini yeniden yüklemek benim için günlükleri anlamaktan daha kolay.
Bunu zaten konuştuğumuz için, lütfen bize vahşilere girmeden, bir işaretçinin bir sınıf değişkeninden nasıl farklı olduğunu ve hangisinin tercih edilebilir olduğunu söyleyin. Anlaşılması zor olan ayrıntılarda, tyrnet'te okuyabilirim. deyim yerindeyse yüzeysel bir anlayış bana yeter...
Merdivenleri ve dalları çitle çevirmemek için gereksiz parantezlerden kurtulmaya çalışıyorum. Baskı olmadan, parantezlere orada ihtiyaç yoktur - yalnızca nesneyi silmek kalır.
Yeni operatörde, fiziksel olarak "bir yerde" bulunan belirli bir mekanizma yaratırsınız. Yeni operatör bu "bir yerin" adresini döndürür. Ve sadece üzerinde bu "mekanizmaya" dönebilirsiniz.
Ve bu mekanizmanın içindeki cıvata bir değişkendir.
Alex, böyle ayrıntılı bir cevap için teşekkürler. Yukarıdaki kod parçasında, ret değişkeninin amacı net değil... Yöntem yine de dizi[0] döndürürse neden hesaplanır?
Verdiğim kodda bir şeyi değiştiren Aleksey'di. Ya da gözden kaçırmış olabilirim - basit bir açıklama için "dizlerimin üstüne" yazdım, ne olduğunu hatırlamıyorum.
Cevap için teşekkürler, hiç de kötü değilsin)
Şimdi belli oldu.)
UPD
Bu tasarım da işe yarıyor
At() yönteminin ne döndürdüğüne dikkat edin. NULL döndürürse, ölümcül bir hatayla kilitlenir. Bir nesneye bir işaretçi ile erişmeden önce, NULL olmayan bir nesne olup olmadığını kontrol edin.
zaten fark ettim)
Yani, çıkış yolu, küresel olarak boş nesneler ilan etmektir ....
Ve eğer önceden bilinmiyorsa, kaç tane olacak? Sadece "bir marjla" ilan etmek mi? :)
PS Yerleşik yardımda, nesneleri bildirmenin böyle bir yolunu bulamadım
Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi
Ve işte OnInit()'te işaretçiler oluşturma döngüsü
ve OnTimer'da()
ArraySize(Rates), çalışılacak karakterleri listeleyen bir dizi yapı boyutudur .
Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi
Ve işte OnInit()'te işaretçiler oluşturma döngüsü
ve OnTimer'da()
ArraySize(Rates), çalışılacak karakterleri listeleyen bir dizi yapı boyutudur .
Burada:
Toplama kadar yapardım - sırf Rates dizisinden karakterleri okuduğunuz için (doğru mu?), yeni bar sınıfının örneklerini oluşturun ve bunları listeye ekleyin.
Herhangi bir ekleme hatası için, yeni çubuk sınıfının örneklerine yönelik işaretçi listesinin boyutu Rates dizisinin boyutuyla eşleşmeyecektir.
Genel olarak, şöyle bir şey:
Ve burada listeye eklemenin başarısını da kontrol etmeniz gerekiyor:
şöyle bir şey:
listeye yeni bir nesneye bir işaretçi ekleme başarısız olduğunda bellek sızıntılarını önlemek içinBurada:
Toplama kadar yapardım - sırf Rates dizisinden karakterleri okuduğunuz için (doğru mu?), yeni bar sınıfının örneklerini oluşturun ve bunları listeye ekleyin.
Herhangi bir ekleme hatası için, yeni çubuk sınıfının örneklerine yönelik işaretçi listesinin boyutu Rates dizisinin boyutuyla eşleşmeyecektir.
Genel olarak, şöyle bir şey:
Ve burada listeye eklemenin başarısını da kontrol etmeniz gerekiyor:
şöyle bir şey:
listeye yeni bir nesneye bir işaretçi ekleme başarısız olduğunda bellek sızıntılarını önlemek içinTeşekkür ederim. anladım öyle düzelteyim ... :))))
Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.
ondan nasıl farklı
Başka bir şey, eğer bir hata durumunda, başarısız bir işaretçi silinirse ... Ama burada bile devam etmeden yapabilirsiniz, ki bundan nefret ediyorum; sadece Print()'i kaldırarak. Hata ayıklama ve neler olduğunu anlamaya çalışırken gerekliydi ve işlem sırasında bir hata meydana gelirse, kimse için neyin yanlış olduğunu anlamayacağım ... İşletim sistemini yeniden yüklemek benim için günlükleri anlamaktan daha kolay.Bunu zaten konuştuğumuz için, lütfen bize vahşilere girmeden, bir işaretçinin bir sınıf değişkeninden nasıl farklı olduğunu ve hangisinin tercih edilebilir olduğunu söyleyin. Anlaşılması zor olan ayrıntılarda, tyrnet'te okuyabilirim. deyim yerindeyse yüzeysel bir anlayış bana yeter...
At() yönteminin ne döndürdüğüne dikkat edin. NULL döndürürse, kritik bir hatayla kilitlenir. Bir nesneye bir işaretçi ile erişmeden önce, NULL olmayan bir nesne olup olmadığını kontrol edin.
Artem, değerli yorumun için teşekkürler)
Teşekkür ederim. anladım öyle düzelteyim ... :))))
Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.
ondan nasıl farklı
Döngünün yinelemesi bitmeyecek ve yenisi başlamayacak, ancak bir sonraki If'ye geçecektir. Mantık değişecek.
Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi
Alex, böyle ayrıntılı bir cevap için teşekkürler.
Yukarıdaki kod parçasında ret değişkeninin amacı net değil...
Yöntem yine de dizi[0] döndürürse neden hesaplanır?
ZY
Bunu neden bir sınıf yönteminde kullanıyorsunuz? Bu özel sınıfın üyeleriyle çalışıyoruz...
Teşekkür ederim. anladım öyle düzelteyim ... :))))
Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.
ondan nasıl farklı
Başka bir şey, eğer bir hata durumunda, başarısız bir işaretçi silinirse ... Ama burada bile devam etmeden yapabilirsiniz, ki bundan nefret ediyorum; sadece Print()'i kaldırarak. Hata ayıklama ve neler olduğunu anlamaya çalışırken gerekliydi ve işlem sırasında bir hata meydana gelirse, kimse için neyin yanlış olduğunu anlamayacağım ... İşletim sistemini yeniden yüklemek benim için günlükleri anlamaktan daha kolay.Bunu zaten konuştuğumuz için, lütfen bize vahşilere girmeden, bir işaretçinin bir sınıf değişkeninden nasıl farklı olduğunu ve hangisinin tercih edilebilir olduğunu söyleyin. Anlaşılması zor olan ayrıntılarda, tyrnet'te okuyabilirim. deyim yerindeyse yüzeysel bir anlayış bana yeter...
Döngünün yinelemesi bitmeyecek ve yenisi başlamayacak, ancak bir sonraki If'ye geçecektir. Mantık değişecek.
Alex, böyle ayrıntılı bir cevap için teşekkürler.
Yukarıdaki kod parçasında, ret değişkeninin amacı net değil...
Yöntem yine de dizi[0] döndürürse neden hesaplanır?