Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 151

 
fxsaber :

Statik değişken ilk çağrıda başlatılır.

geliştiricilerin bunu neden yaptığını tahmin etmek zor, bence bu bir hata - derleme aşamasında bilinmeyen bir değere sahip sabit bir değişkenin başlatılması

Genellikle neyin ve ne zaman başlatıldığını kontrol ederim

 //+------------------------------------------------------------------+
void OnStart ()
{
   f( 333 );
   f( 2 );
}
//+------------------------------------------------------------------+
int init_static()
{
   Print ( __FUNCTION__ );
   return ( 1 );
}

void f( const int i )
{
   static const int j = init_static();
  
   Print ( __FUNCTION__ , " , j =" ,j);
}

2019.11.30 11:09:32.456 tst (EURUSD,H1) init_static

2019.11.30 11:09:32.457 tst (EURUSD,H1) f , j=1

2019.11.30 11:09:32.457 tst (EURUSD,H1) f , j=1


benim örneğimde, her şey doğru bir şekilde başlatıldı ve derleyici gelecekte j sabitine bir değer vermiyor - bir derleme hatası olacak

 
Vladimir Simakov :

Resmi açıklamalar gelene kadar kullanmanızı tavsiye etmiyorum, bir anda alıp düzelteceklerdir.

Eh, hiçbir durumda kullanmaya değmez, çünkü. bu kavramsal bir hatadır.

 
Alexey Navoykov :

Eh, hiçbir durumda kullanmaya değmez, çünkü. bu kavramsal bir hatadır.

Neden kavramsal? Aksine, bazen derleme aşamasında statik bir değişkenin hangi değerden başlatılacağı bilinmez, burada, sadece ilk yardım çağrısında başlatma.

 
Alexey Navoykov :

Eh, hiçbir durumda kullanmaya değmez, çünkü. bu kavramsal bir hatadır.

MVS C++17'nin Uygulanması:

Statik yerel değişkenler

static veya thread_local (C++11'den beri) belirteci ile blok kapsamında bildirilen değişkenler, statik veya thread (C++11'den beri) depolama süresine sahiptir, ancak kontrol bildirimlerinden ilk geçtiğinde başlatılır (başlatmaları sıfır veya blok ilk girilmeden önce gerçekleştirilebilen sabit başlatma ). Diğer tüm aramalarda bildirim atlanır.

Başlatma bir istisna atarsa , değişkenin başlatıldığı düşünülmez ve denetim bildirimden bir sonraki geçişte başlatma yeniden denenir.

Başlatma, değişkenin başlatıldığı bloğa yinelemeli olarak girerse, davranış tanımsızdır.

Birden çok iş parçacığı aynı statik yerel değişkeni aynı anda başlatmaya çalışırsa, başlatma tam olarak bir kez gerçekleşir (benzer davranış std::call_once ile isteğe bağlı işlevler için elde edilebilir).

Not: Bu özelliğin olağan uygulamaları, halihazırda başlatılmış yerel statikler için çalışma zamanı ek yükünü atomik olmayan tek bir boole karşılaştırmasına indirgeyen, çift kontrol edilen kilitleme modelinin türevlerini kullanır.

(C++11'den beri)

Bir blok kapsamlı statik değişken için yıkıcı , program çıkışında çağrılır , ancak yalnızca başlatma başarılı bir şekilde gerçekleştiyse.

Aynı satır içi işlevin (dolaylı olarak satır içi olabilir) tüm tanımlarındaki işlev yerel statik nesnelerinin tümü, bir çeviri biriminde tanımlanan aynı nesneye atıfta bulunur.

Şahsen ben sadece böyle bir uygulamanın mql'de yasal olması durumunda, sadece rıhtımlara kaydedilmesi gerekiyor.

 
Vladimir Simakov :

Neden kavramsal? Aksine, bazen derleme aşamasında statik bir değişkenin hangi değerden başlatılacağı bilinmez, burada, sadece ilk yardım çağrısında başlatma.

Sıfır (varsayılan) değeri başlatmanın gerekli olduğu anlamına gelir. Ve neden karşısına çıkan ilk değerle başlasın? Ardından, işlevin davranışının, bu işleve yapılan çağrıların sırasına göre belirlendiği ve bir yan etki yarattığı ortaya çıktı. Ve bu yanlış. Dahilileri dışarıdan başlatmak istiyorsanız, bir işlev değil, bir sınıf kullanmanız gerekir.

Ancak, bunun derlenemediğini söylerken gerçekten yanılmışım. C++'da bu, garip bir şekilde işe yarıyor, ancak bunu yapmak hiç aklıma gelmedi.

 
Alexey Navoykov : C++'da çalışıyor, garip bir şekilde, bunu yapmak hiç aklıma gelmemiş olsa da.

Orada hep böyle oldu, kavramsal sorun yok, başka türlü olsaydı sorunlar olurdu.

 void fn() {
   static int i = fn_from_other_cpp();
}

Ve imha sırası kesinlikle tersine çevrilir.

 
Vict :

Orada hep böyle oldu, kavramsal sorun yok, başka türlü olsaydı sorunlar olurdu.

Örneğiniz biraz başka bir operadan.
 
Slava :

"Düzenle" bağlam menüsünü seçtikten sonra, gezgin kaynak mq5'i ex5 ile aynı yolda bulamaz.

Çünkü ex5, mq5'in yaşadığı Paylaşılan Projelerden komut dosyaları klasörüne taşınmıştır.

Hadi düzeltelim. Test cihazı ayarlarındakiyle aynı akıllı aramayı yapalım

Bir de tam tersi bir durum var. Navigator'da Favoriler'de, ex5 eksikse (örneğin bir derleme hatası oluştu) mq5 düzenlemeye (mq5 kullanılabilir) geçmek mümkün değildir. Lütfen bunu da düzeltin.

 
fxsaber :

Bir de tam tersi bir durum var. Navigator'da Favoriler'de, ex5 eksikse (örneğin bir derleme hatası oluştu) mq5 düzenlemeye (mq5 kullanılabilir) geçmek mümkün değildir. Lütfen bunu da düzeltin.

2250 harika.

Acele et. 2251 - mq5'i açmıyor.

 
fxsaber :

2250 harika.

Acele et. 2251 - mq5'i açmıyor.

O var mı? gerçekten var mı? Hangi yön?

Nasıl çoğaltabilirsin?