Hatalar, hatalar, sorular - sayfa 2564

 
Igor Makanu :

?

garip bir durum, sınıf dışındaki her şey uzun süredir statik ile çalışıyor. ve ben burada çarmıha geriliyorum .... eğlence için, kodu kendiniz için yeniden oluşturun:

Bir nesne örneği görüyor musunuz? ... ve MQL'de ;)

Not: ve referans düzeyinde ... bana ne iddia ediyor?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

pr


imp

 
Andrey Barinov :

Aynı kuralların tümü (özel, korumalı, genel) statik için geçerlidir, yalnızca bir .

Genel olarak, hayır: örneğin, türetilmiş bir sınıfta bir genel statik kısıtlanamaz

 
Andrey Barinov :



hmm... Durumun saçmalığını nasıl açıklasam... Neden yine benden alıntı yapıyorsun? Yöneticilerin (geliştiricilerin) mesajlarını okumanızı önerdim, yazdıkları sertifikayı gösterdim, fotoğraflarınızla benden ne istiyorsunuz?

Neden böyle olduğunu düşünmüyorum, forumu okuyorum ve geliştiricilerin önerdiği gibi yardım ediyorum ve yapıyorum. Gerekli olduğunu düşünüyorsanız, "C++ Standartlarının Korunması Komitesine", BM'ye yazın ... iyi, en azından PM'deki yöneticiye, zayıfsa, ancak sonra geliştiricilerin mesajlarını alıntılayın ve yol!

Not: Bir şekilde resim değil kaynak eklemeyi başardım, neden işinize yaramadı?

 int print( int value)
{   Print (value, ":" , __FUNCTION__ ); 
 return (value);
}
class A
{
private :
   static int         a1;
   static void        inc_a1(){a1++; Print ( "a1 = " , a1);}
protected :
   static int         a2;
public :
   static int         a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print( 1 );
static int A::a2 = print( 2 );
static int A::a3 = print( 3 );

//+------------------------------------------------------------------+
void OnStart ()
{

A::inc_a1();
A::inc_a1();
A::inc_a1();

}

2019.09.17 22:11:49.534 tst (EURUSD,H1) 1:yazdır

2019.09.17 22:11:49.535 tst (EURUSD,H1) 2: yazdır

2019.09.17 22:11:49.535 tst (EURUSD,H1) 3: yazdır

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 2

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 3

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 4

Not: durum oldukça komik, yardım etmek istedim, şimdi bahane uyduruyorum .... neden? - peki, tırabzana vur, gerçeği ara ... tırmıkla bas ....
 
Igor Makanu :

Kodda , hata yalnızca özel yönteme erişimdedir. Bu hata yakın zamanda ortaya çıktı.

 

ChartOpen işlevi , hizmette her zaman 0 döndürür. Programın kendisi açılmasına rağmen.

 #property service

//int OnInit()
void OnStart ()
  {
   long Otvet= ChartOpen ( Symbol (), PERIOD_D1 );
   Print ( "Otvet=" ,Otvet);

   // return(INIT_SUCCEEDED);
  }
 
fxsaber :

Kodda , hata yalnızca özel yönteme erişimdedir. Bu hata yakın zamanda ortaya çıktı.

Bir şeyi unuttuğumu sandım, bu yüzden statiklerin C#'da nasıl davrandığını yeniden okudum https://metanit.com/sharp/tutorial/3.6.php

Bir sınıfın statik üyeleri, o sınıfın tüm nesneleri için ortaktır, dolayısıyla bunlara sınıf adıyla başvurulmalıdır:

Statik yöntemlerin yalnızca bir sınıfın statik üyelerine erişebileceğini unutmayın. Statik bir metot içinde statik olmayan metotlara, alanlara, özelliklere atıfta bulunamayız.


ve MQL'de, statikler OnInit() başlatılmadan önce başlatılır, şimdi statik için özel yöntemlerin küresel görünürlüğünü tartışıyoruz... IMHO sınıfındaki veri koruma özelliklerini kullanın

Ve bu nasıl bir bug? - evet, geliştiriciler döndükçe öyle olacak, ancak bağlam işlemini kullanırken davranışın programcı tarafından belirlendiğini (bağlam çözümleme operatörü dilde en yüksek önceliğe sahip operatördür!) ve ne kadar olduğunu yazıyorum derleyici doğru şekilde yardımcı olabilir, peki, nasıl gidiyor)))

bu şekilde mi çalışıyor?

 class A
  {
private :
   static void               My_function()
     {
       Print ( "^_^" );
     }
  };
  
A a;
void OnStart ()
  {
   A::My_function();
   a.My_function();   // 'A::My_function' - cannot access private member function         
  }

genel olarak, görevler gerçekleştirilir


Not: 2145'e güncellendi - statik kod aynı şekilde davranır, peki, eğer yarım yıl boyunca böyle kalırsa, bunun statiğin planlanan davranışı olduğu ortaya çıkacaktır;)

UPD: Her şeyin nasıl argo olarak adlandırıldığını hatırladım - kirli numaralar! ))) - İnternette, bu davranışın bir dil standardı olarak algılandığı ve bir yerde üreticinin belirli derleyicilerine bağlı olduğu birçok örneğini arayın. Python'da eval() esasen doğrusal kod yürütmeyi tamamen bozar mı? - peki, biri kullanıyor, biri kullanmamak için yazıyor, çünkü öngörülemeyen davranış


UPD: 2145 için kontrol edildi sorunuz bir ay önce soruldu https://www.mql5.com/ru/forum/320733#comment_12989063

https://www.mql5.com/en/forum/320733#comment_12958594

 void OnStart ()
  {
   double x= 100.0 ;
   f(x);
  }
//_______________________________________________________________________
void f( bool v)
  {
  }
//_______________________________________________________________________

hiçbir şey değişmedi, derleyici türleri kontrol ederken bool için nasıl uyarı yazılacağını öğrenmedi - bu çok tatsız , MQL derleyicisinin her zaman kesinlikle tür eşleşmesini izlediğinden emin olmama rağmen kodumda zaten bir hata aradım

 
Igor Makanu :

Ve bu nasıl bir bug? - evet, geliştiriciler döndükçe, öyle olacak

Hatanın giderileceği aşikar.

hiçbir şey değişmedi, bool üzerinde türleri kontrol ederken, derleyici nasıl uyarı yazılacağını öğrenmedi

İşaretçilerin ve sayısal türlerin bool'a otomatik olarak aktarılması çok uygundur.

 
Igor Makanu :

hiçbir şey değişmedi, derleyici türleri kontrol ederken bool için nasıl uyarı yazılacağını öğrenmedi - bu çok tatsız , MQL derleyicisinin her zaman kesinlikle tür eşleşmesini izlediğinden emin olmama rağmen kodumda zaten bir hata aradım

Bu döküm ile veri kaybı olmaz. 0 veya 0 değil.

Başka bir şey, double kullanıldığında -> herhangi bir tamsayı türü (int32'ye kadar ve dahil)

 
Slava :

Bu döküm ile veri kaybı olmaz. 0 veya 0 değil.

Başka bir şey, double kullanıldığında -> herhangi bir tamsayı türü (int32'ye kadar ve dahil)

ama tam tersi?

Zaten kodda bir hata arıyordum

başta bir test yazdım ama önce int kullandım sonra bool yönünde bıraktım ama kodun tamamını düzeltmedim artık hatırlamıyorum ama şöyle bir şey :

 void OnStart ()
{   int x= 100.0 ;
   f(x); }
//_______________________________________________________________________
void f( int   v)   //так тестил
{
   if (v> 0 ) v++;

}

//_______________________________________________________________________
void f( bool   v)   // потом решил, что мне нужен флаг, а ниже забыл исправить код
{
   if (v> 0 ) v++;

}
//_______________________________________________________________________


Şimdi bu davranış için biraz hazırım, ama neden bunun hakkında yazıyorum ... peki, if() içindeki MQL koşullarını kontrol ederken - türleri kesinlikle kontrol ediyor mu? Boole olmayan işlemlerin herhangi bir kullanımı aynı uyarıyı veriyor mu? - peki, VS2017'de aynı C#'da yazdığım gibi - örnek kodum derlenmeyecek ve MQL uyarı vermiyor. Benim düşünceme göre, MQL programlamaya yeni başlayanlar için bu davranış bazı sürprizlerle doludur.

 
fxsaber :

Hatanın giderileceği aşikar.

Tartışmayacağım, ancak benim görüşüm, sınıftan statik yoluyla ayrılırken ve bağlam çözümleme operatörünü kullanırken derleyicinin kontrolüne güvenmeye değmez.

onlar. statik bir yöntem/alan yazdıysanız veya uyguladıysanız :: - derleyiciye güvenmeyin