Hatalar, hatalar, sorular - sayfa 1681

 
Karputov Vladimir :
Alıntıların açık veya kapalı olması önemli değil. Göstergede, prev_calculate==0 koşulunu kontrol etmeniz gerekir - bu, geçmişin değiş tokuşudur ve ikinci nokta, değişen çubukları yeniden hesaplamanın koruma modudur, yani, aslında, Rates_total -prev_calculate+1.

Önce yazılanları okuyacak, sonra cevap vereceksin. Hata ayıklayıcı hatasını yeniden oluşturmak için kod! Tüm oynatma verileri verilir.

İşte aynı hatayı yeniden oluşturmak için bir komut dosyası

 int Func(){ return ( 0 ); }

int Func2()
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо  
   return (Func()); // здесь поставить точку останова (F9)
}

void OnStart ()
{
  Func2();
}
 
fxsaber :
Önce yazılanları okuyacak, sonra cevap vereceksin. Hata ayıklayıcı hatasını yeniden oluşturmak için kod! Tüm oynatma verileri verilir.

Size cevap verdim - OnCalculate'in kaç kez çağrıldığı umurunuzda değil. Göreviniz, iki değeri analiz ederek göstergenin tam veya kısmi yeniden hesaplanmasını sağlamaktır: oranları_toplam, ön_hesapla ve ön_hesapla==0 olduğunda koşul.

OnCalculate()'in bir veya iki kez çağrılması gereken zor ve hızlı koşullar yoktur. OnCalculate() kimseye hiçbir şey borçlu değildir. Ancak programcı iki değeri kontrol etmelidir: Rate_total, prev_calculate ve prev_calculate==0 olduğunda koşul.

 
Karputov Vladimir :
Size cevap verdim - OnCalculate'in kaç kez çağrıldığı umurunuzda değil. Göreviniz, iki değeri analiz ederek göstergenin tam veya kısmi yeniden hesaplanmasını sağlamaktır: oranları_toplam, ön_hesapla ve ön_hesapla==0 olduğunda koşul.

Hata ayıklayıcının kaç kez çağrıldığını ve OnCalculate'in kaç kez çağrıldığını umursuyorum. Ben doğası gereği bir BORE'um! Ve bununla ilgili her şeye sahibim.

Sorunun özünden tamamen habersizsin, bana bir şeyler öğretmeye çalışıyorsun. Tabii ki teşekkür ederim. Ama dinleyelim ve rakibimizi duyalım.

 
fxsaber :

Hayır, şu anda alıntılar durduğunda RTS çalıştırıyorum. Bir kez çağrıldığını öğrendim ve hata ayıklayıcı yalan söylüyor, iki olduğunu gösteriyor. Oynatılacak kod (tiklerin olmadığı bir sembol üzerinde çalıştırın)

F5'e bastıktan sonra bir kesme noktasına ulaşılacaktır. Ve F5'e ikinci basıştan sonra - benzer şekilde. Bu olmamasına rağmen - bir onay olarak, koddaki satırın yorumunu kaldırabilir ve onunla deneyebilirsiniz.

Bu şekilde neler olduğunu görebilirsiniz. Birinci ve ikinci duraklarda i değerini takip edin.

 int Func( int & i)
{
        i++;
         return 0 ;
}

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[] )
{
         int i = 1 ;
         return (Func(i)); // здесь поставить точку останова (F9)
}
 
Sergei Vladimirov :

Bu şekilde neler olduğunu görebilirsiniz. Birinci ve ikinci duraklarda i değerini takip edin.

takip ettim o yüzden yazdım

Bir kez çağrıldığını öğrendim ve hata ayıklayıcı yalan söylüyor, iki

Hata ayıklayıcı neden F5'e ikinci kez bastıktan sonra beni aynı yere geri götürüyor? return(0) ile bu olmaz, ki bu doğrudur.

 

Evet, yalan söylemez, ancak iki kez durur - parantez içindeki ifadeyi hesaplamadan önce ve ondan sonra, geri dönmeden hemen önce.

Bu arada, bence çok uygun bir özellik. Hatırlamak gerek. Çıkmadan önce dönüş değerini kontrol etmek için sonucu parantez içinde ayrı bir değişkene koymanız gerekmez, hata ayıklayıcı tekrar kendini durduracaktır.

 
Sergei Vladimirov :

Evet, yalan söylemez, ancak iki kez durur - parantez içindeki ifadeyi hesaplamadan önce ve ondan sonra, geri dönmeden hemen önce.

Bu arada, bence çok uygun bir özellik. Hatırlamak gerek. Çıkmadan önce dönüş değerini kontrol etmek için sonucu parantez içinde ayrı bir değişkene koymanız gerekmez, hata ayıklayıcı ikinci kez kendini durduracaktır .

uygun olduğuna katılıyorum. Ancak hata ayıklayıcıda bir değişken olmadan çıkmadan önce dönüş sonucunu nasıl anlarsınız?
 
fxsaber :


Bu kodu koyun:

 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[])
  {
   int i= 1 ;
   Print ( "Перед: i " ,i, ",rates_total " ,rates_total, ", prev_calculated " ,prev_calculated);
   int rezult=Func(i);
   Print ( "После: i " ,i, ",rates_total " ,rates_total, ", prev_calculated " ,prev_calculated);
   return (rezult); // здесь поставить точку останова (F9)
  }

ve göstergeyi çizelgeye çizin . Ardından terminali yeniden başlatın (göstergeyi tablodan kaldırmanız gerekmez). OnCalculate() öğesinin bir, iki, hatta üç kez çağrılabileceğini göreceksiniz. Yani, yukarıda söylediğim gibi - zor ve hızlı kurallar yoktur.

 
Karputov Vladimir :

Bu kodu koyun:

ve göstergeyi çizelgeye çizin . Ardından terminali yeniden başlatın (göstergeyi tablodan kaldırmanız gerekmez). OnCalculate() öğesinin bir, iki, hatta üç kez çağrılabileceğini göreceksiniz. Yani, yukarıda söylediğim gibi - zor ve hızlı kurallar yoktur.

Rakibin ne yazdığını duymak konusunda kesinlikle isteksiz olduğun için beni şikayet etmeye zorluyorsun.
 
fxsaber :
uygun olduğuna katılıyorum. Ancak hata ayıklayıcıda bir değişken olmadan çıkmadan önce dönüş sonucunu nasıl anlarsınız?

Çıkmadan önce ne döndürdüğünü görmek için Func() gövdesine bakın. Belirli bir vakadan bahsediyorum. Değer doğrudan parantez içinde hesaplanacaksa, elbette hiçbir şekilde.

not. Gerçi... Neden olmasın? İkinci durakta, tüm return() argümanlarının değerlerine bakın ve sonucu hesaplayın. )